2011-01-26 29 views
1

我正在研究一个使用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]; 
    } 
} 

那种作品,因为下一次应用程序启动它会提示再次登录。但是如果应用程序继续运行,它不会提示另一次登录。

+0

我也面临类似的问题。你有没有找到解决方案? – 2014-01-26 03:26:56

+0

不,我从来没有找到一个好的答案。 – 2014-01-30 16:25:54

回答

0

你确定使用端口0,没有领域是正确的吗? 只是为了确保我从我的connect-url-string(与所有ASIHTTPRequest使用的URL相同)创建NSURL,并从中检索主机,端口和协议。我现在只需亲自提一下这个领域。

使用此代码我能在我的应用程序成功登出:

// clear keychain 
NSURL *url = [NSURL URLWithString:kConnectorUrlString]; 
[ASIHTTPRequest removeCredentialsForHost:[url host] port:[[url port] intValue] protocol:[url scheme] realm:kConnectorRealm]; 

我的应用程序再次提示我,当我让我的应用程序继续运行。 我正在使用传递给saveCredentials的相同参数。