【问题标题】:NSURLConnection, NSURLRequest, untrusted cert and user authenticationNSURLConnection、NSURLRequest、不受信任的证书和用户身份验证
【发布时间】:2011-02-26 08:06:12
【问题描述】:

大家早上好,

我一直在尝试编写一个应用程序,该应用程序从需要身份验证的远程 Web 服务执行一些 GET。我的主要问题是这些远程服务器中的大多数(并且有很多)没有有效的证书。我有code to accept the invalid certificate 和代码,可以用正确的 uname 和 pass 来响应挑战(如下)。我遇到的问题是让两个人一起玩。我似乎无法找到发送挑战的方法NSURLCredentials 或正确链接回调的方法。当我尝试链接它们时,我无法让我的NSURLRequest 两次调用didReceiveAuthenticationChallenge

任何想法将不胜感激!

身份验证代码...

-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{   
    if(!hasCanceled){
        if ([challenge previousFailureCount] == 0) {
            NSURLCredential *newCredential;
            newCredential=[NSURLCredential credentialWithUser:_username password:_password persistence:NSURLCredentialPersistenceNone];
            [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
        } 
        else {
            [[challenge sender] cancelAuthenticationChallenge:challenge];
            NSLog(@"Bad Username Or Password");
            badUsernameAndPassword = YES;
            finished = YES;
        }
    }
}

【问题讨论】:

    标签: iphone cocoa nsurlconnection nsurlrequest nsurlcredential


    【解决方案1】:

    您只能使用该挑战的凭据回复 NSURLAuthenticationChallenge。您可以使用以下方法确定您收到的挑战类型:

    [[challenge protectionSpace] authenticationMethod]
    

    可能的值为documented here。在服务器证书无效的情况下,身份验证方法将为NSURLAuthenticationMethodServerTrust。在您的代码中,您应该检查身份验证方法并做出适当的响应。

    if ([challenge previousFailureCount] > 0) {
        // handle bad credentials here
        [[challenge sender] cancelAuthenticationChallenge:challenge];
        return;
    }
    
    if ([[challenge protectionSpace] authenticationMethod] == NSURLAuthenticationMethodServerTrust) {
        // check if the user has previously accepted the certificate, otherwise prompt
    } else if ([[challenge protectionSpace] authenticationMethod] == /* your supported authentication method here */) {
        [[challenge sender] useCredential:/* your user's credential */ forAuthenticationChallenge:challenge];
    }
    

    如果您每次都没有收到两个身份验证质询,这不是错误。您可以在创建凭据时缓存它们。如果这样做,您不一定会再次收到提示。

    【讨论】:

    • 工作就像一个魅力。需要正确实现“canAuthenticateAgainstProtectionSpace”方法才能让我的应用程序调用此方法。但在那之后一切都很好。谢谢!
    猜你喜欢
    • 2011-06-30
    • 1970-01-01
    • 2014-02-24
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    相关资源
    最近更新 更多