认证指的是确认访问系统的用户身份的过程。

示例应用有两种认证模式:标准验证、快速验证。

标准验证只是提示用户输入用户名和密码。

快速验证让用户注册设备,然后使用PIN进行验证,每次验证时无需用户名与密码。

示例应用的标准认证模式使用HTTP Basic认证,而快速认证则使用从Web Service下载的客户端证书。

HTTP Basic、HTTP Digest与NTLM认证

这些都是基于用户名/密码的认证。

HTTP Basic是明文传输用户名和密码的,但是搭配了SSL。

HTTP Digest在传输密码前会对其进行MD5哈希处理,同时会配以密码随机数。密码随机数是个随机数或伪随机数,用于对消息进行签名,不过每个值只能使用一次。所以可以防止重放攻击。HTTP Basic与HTTP Digest认证现在已经合并成一个标准。

NSURLConnection会完成各种认证方法的随机数与哈希值的处理工作,这样只需以NSURLCredential对象的形式指定认证信息就可以了。

NSURLCredential适合于大多数的认证请求,因为它可以表示由用户名/密码组合、客户端证书以及服务器信任创建的认证信息。认证信息有各种持久化选项:不持久化、只对当前会话持久化、永久持久化。

下面展示了通过willSendRequestForAuthenticationChallenge:方法响应用户名和密码的认证挑战过程:

-(void)connection:(NSURLConnection *)connection
willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodHTTPBasic)
    {
        if (challenge.previousFailureCount == 0)
        {
            NSURLCredential *creds = [[NSURLCredential alloc]
                                      initWithUser:@"username"
                                      password:@"password"
                                      persistence:NSURLCredentialPersistenceForSession];
            [challenge.sender useCredential:creds forAuthenticationChallenge:challenge];
        }
        else
        {
            [challenge.sender cancelAuthenticationChallenge:challenge];
            dispatch_async(dispatch_get_main_queue(), ^
            {
                //提示关闭了
            });
        }
    }
}

客户端证书认证

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐