【发布时间】:2011-01-26 14:14:24
【问题描述】:
我正在开发一个 iPhone 应用程序,该应用程序使用 ASIHTTPRequest 与使用 NTLM 身份验证的 Web 服务进行交互。并且凭据应该存储在钥匙串中。它可以正常登录,但我想要一个注销按钮来清除应用程序中的凭据,但我无法让它工作。
单击注销按钮后,我希望当我返回查询服务器的视图时,系统会提示我重新登录。但是,这并没有发生,对服务器的调用仍然通过身份验证。
发出请求的代码如下所示:
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];
}
}
这种方法很有效,因为下次启动应用程序时,它会再次提示登录。但如果应用程序继续运行,它不会提示再次登录。
【问题讨论】:
-
我也面临类似的问题。你找到解决办法了吗?
-
不,我从来没有找到一个好的答案。
标签: iphone asihttprequest