我正在研究一个使用ASIHTTPRequest与使用NTLM身份验证的Web服务进行交互的iPhone应用程序。证书应该存储在钥匙串中。它的日志记录正常,但我想要一个注销按钮,从应用程序中清除凭据,我无法让它工作。从ASIHTTPRequest中清除凭据
当我点击注销按钮后,我希望当我回到查询服务器的视图时,我会提示重新登录。但是,这并没有发生,并且对服务器的调用仍然进行身份验证。
发出请求的代码如下所示:
NSString *urlString = [NSString stringWithFormat:@"http://myserver.mydomain.com/myapp/items/%@", itemGroupId];
NSURL *url = [NSURL URLWithString:urlString];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setUseKeychainPersistence:YES];
[request setShouldPresentAuthenticationDialog:YES];
[request setRequestMethod:@"POST"];
[request addRequestHeader:@"content-type" value:@"application/json;charset=utf-8"];
[request addRequestHeader:@"content-length" value:@"0"];
[request setDelegate:self];
[request startAsynchronous];
对于注销,我已经打过电话:
[ASIHTTPRequest removeCredentialsForHost:@"myserver.mydomain.com" port:0 protocol:@"http" realm:nil];
但是,这并不工作。该方法中的代码没有找到已保存的NSURLCredential,因此它可以将其删除,即使这些参数是我所看到的传递给saveCredentials的:forHost:port:protocol:realm:首先。
我也尝试调用clearSession,并且我尝试使用setUseSessionPersistence创建请求时完全禁用会话持久性,但没有运气。
我也尝试使用基于this example通过应用中的全部的钥匙串证书的循环,并删除它们的所有代码:
NSURLCredentialStorage *store = [NSURLCredentialStorage sharedCredentialStorage];
for (NSURLProtectionSpace *space in [store allCredentials]) {
NSDictionary *userCredentialMap = [store credentialsForProtectionSpace:space];
for (NSString *user in userCredentialMap) {
NSURLCredential *credential = [userCredentialMap objectForKey:user];
[store removeCredential:credential forProtectionSpace:space];
}
}
那种作品,因为下一次应用程序启动它会提示再次登录。但是如果应用程序继续运行,它不会提示另一次登录。
我也面临类似的问题。你有没有找到解决方案? – 2014-01-26 03:26:56
不,我从来没有找到一个好的答案。 – 2014-01-30 16:25:54