如果远程服务器返回了需要身份认证的状态码,而且该身份认证是基于连接级别(connection-level)的询问方式(比如SSL客户端证书),NSURLSession会调用询问身份认证的代理方法。
- 对于存在会话层的询问——NSURLAuthenticationMethodNTLM, NSURLAuthenticationMethodNegotiate, NSURLAuthenticationMethodClientCertificate, 以及NSURLAuthenticationMethodServerTrust。
NSURLSession对象会调用代理方法URLSession:didReceiveChallenge:completionHandler: 。如果我们在app中并没有提供session的代理方法,该session对象会调用对应任务的代理方法URLSession:task:didReceiveChallenge:completionHandler:来处理询问。 - 对于没有会话层的询问,NSURLSession对象调用对应任务的代理方法URLSession:task:didReceiveChallenge:completionHandler:来处理询问。如果我们在app中提供了session的代理,那么就需要自己来处理身份认证,在任务这一层去处理身份认证或者提供一个任务级别的处理程序,并明确地为每一个session调用该处理程序。session的代理方法URLSession:didReceiveChallenge:completionHandler:不会在没有会话层的询问中被调用。
提示
Kerberos的身份认证方式是透明的。
如果是基于数据流上传的请求实体,该任务在身份认证时失败,它(任务)无法明确且安全地去从头去重用该数据流。NSURLSession对象会调用代理方法URLSession:task:needNewBodyStream:去获取一个新的NSInputStream对象,并为新的网络请求提供请求实体数据(如果该任务的请求实体是以NSData对象或者文件的形式,那么这个session对象就不会调用该代理方法)。
更多关于NSURLSession和相关的代理方法的编写,查看后面“身份认证询问和TLS链验证”。