【问题标题】:Clearing credentials from ASIHTTPRequest从 ASIHTTPRequest 清除凭据
【发布时间】: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


【解决方案1】:

您确定使用端口 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 的相同参数。

【讨论】:

  • 不,我不确定端口 0 和领域是否正确,但我只是验证了这些是传递给 saveCredentials 的值。我尝试了您的建议,但它对我不起作用 - 它仍在某处缓存凭据。你在使用 NTLM 吗?我想知道这是否会有所不同...
  • 不,我没有使用 NTML。我目前正在使用基本访问身份验证。所以很遗憾,我无法重现您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 2016-04-02
相关资源
最近更新 更多