认证指的是确认访问系统的用户身份的过程。
示例应用有两种认证模式:标准验证、快速验证。
标准验证只是提示用户输入用户名和密码。
快速验证让用户注册设备,然后使用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(), ^
{
//提示关闭了
});
}
}
}
客户端证书认证