gpt4 book ai didi

objective-c - NSURLCredential 和 NSURLConnection

转载 作者:行者123 更新时间:2023-12-03 16:22:56 26 4
gpt4 key购买 nike

我一直在尝试寻找一种方法来在使用 NSURLCredentialPersistenceForSession 的 NSURLConnection 设置 NSURLCredential 后取消设置凭据,但我找不到有效的解决方案。从 NSURLCredentialStorage 中删除 NSURLCredential 只会将其从存储中删除,而不是从 NSURLConnection 缓存中删除。我尝试关闭缓存,但它仍然保留。我需要它是 NSURLCredentialPersistenceForSession 因为我不希望它上传大数据然后返回您需要验证的消息然后使用 NSURLConnection 进行身份验证然后重新发送大数据,我只想验证一次并发送大数据一次。我有一种在发送大数据之前通过检查某些属性进行身份验证的方法,但这不允许我注销或重新请求身份验证。我正在编写一个 WebDav 客户端,以便您了解我的立场,我需要取消设置凭据的原因是如果有人在 WebDav 服务器上拥有多个帐户并想要登录另一个帐户。我尝试查看 cookie,看看它是否在那里设置了某些内容,但没有。我知道这仅适用于 session ,这意味着一旦您退出并重新启动应用程序,您就可以以其他用户身份登录。但这可能会让一些人感到困惑。我想过编写自己的身份验证系统,但我不知道这需要多长时间。

抱歉,如果上面的消息太长,我只是确保详细解释所有内容,以便有人可以尝试帮助我提供有效的答案,而不是“去这里引导我尝试一下”。

感谢您的帮助,
壁虎先生。

更新:示例代码。

CFHTTPMessageRef message = [self httpMessageFromResponse:response];
authentication = CFHTTPAuthenticationCreateFromResponse(kCFAllocatorDefault, message);

CFHTTPMessageRef message = [self httpMessageFromRequest:request];
CFStreamError error;
CFHTTPMessageApplyCredentials(message, authentication, (CFStringRef)[credentials user], (CFStringRef)[credentials password], &error);
NSLog(@"%d", error.error); // Returns -1000
CFStringRef value = CFHTTPMessageCopyHeaderFieldValue(message, CFSTR("Authorization"));
NSLog(@"%@", (NSString *)value); // Returns NULL
if (value!=NULL)
CFRelease(value);

更新:我尝试删除凭据的代码。

- (void)resetCredentials {
NSURLCredentialStorage *store = [NSURLCredentialStorage sharedCredentialStorage];
NSDictionary *allCredentials = [store allCredentials];
NSArray *keys = [allCredentials allKeys];
for (int i=0; i<[keys count]; i++) {
NSURLProtectionSpace *protectionSpace = [keys objectAtIndex:i];
NSDictionary *userToCredentialMap = [store credentialsForProtectionSpace:protectionSpace];
NSArray *mapKeys = [userToCredentialMap allKeys];
for (int u=0; u<[mapKeys count]; u++) {
NSString *user = [mapKeys objectAtIndex:u];
NSURLCredential *credential = [userToCredentialMap objectForKey:user];
NSLog(@"%@", credential);
[store removeCredential:credential forProtectionSpace:protectionSpace];
}
}
}

最佳答案

我正在使用 webdav 服务器并遇到类似的问题。我在苹果的 AdvancedURLConnection 项目的示例代码中找到了解决方案。看来 secret 是迭代保护空间,然后迭代每个空间的凭据。它可能不必要地过于复杂,但它对我有用。

NSURLCredentialStorage *store = [NSURLCredentialStorage sharedCredentialStorage];
assert(store != nil);
for (NSURLProtectionSpace *protectionSpace in [store allCredentials]) {
NSDictionary *userToCredentialMap = [[NSURLCredentialStorage sharedCredentialStorage] credentialsForProtectionSpace:protectionSpace];
assert(userToCredentialMap != nil);
for (NSString *user in userToCredentialMap) {
NSURLCredential *credential = [userToCredentialMap objectForKey:user];
assert(credential != nil);
[store removeCredential:credential forProtectionSpace:protectionSpace];
}
}

关于objective-c - NSURLCredential 和 NSURLConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4852199/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com