NSURLProtectionSpace : 需要认证的服务器或域, 是所有进来的 NSURLAuthenticationChallengs 的一个属性
实现 willSendRequestForAuthenticationChallenge: 可以检查挑战, 确定是否想要响应服务器的认证挑战, 同时发出恰当的挑战响应. 认证挑战响应是 NSURLCredential 的实例, 可用于创建信任、用户名/密码组合和客户端证书, 下一节将会对此进行详细介绍. 在创建服务器信任的 NSURLCredential 时, 委托需要对信任做出判断
当确定要支持的保护空间后, 请先创建它们, 然后将它们添加到数组中以便与进来的认证挑战相比较. 如果认证挑战的保护空间与所有支持的空间不匹配, 那么你应该通知用户并取消认证挑战
既然已经实现了服务器验证, 那它是如何保护应用的用户呢? 这种特定的验证会确保应用只与指定的服务器进行通信. 如果发现处于恶意网络之上, 传输被重新路由到第三方服务器(比如 yourbankingdomain.phishing.com), 那么保护空间验证就会因不匹配的主机而失败, 后续的通信也会终止. 更为重要的是, 登录认证信息、银行账号等信息是绝不会传输的
复杂的 iOS 应用常常会与 Web Service 通信, 这些服务可能经常会发生变化. 但遗憾的是, iOS 应用的修改需要经由 Apple 审批, 这个结果是不可预知的. 组织肯定不希望遇到必须立刻修改 Web Service 认证的情况, 否则应用就无法正常运行. 要想解决这个风险问题, 应用包含的保护空间需要考虑到与备份认证服务器或其他备选服务器通信的问题. 包含多个保护空间可以实现一定程序的灵活性, 不过这最终是每个组织都需要评估的安全决策.
实现后端灵活性的另一种方式是只验证认证挑战中的某些属性, 比如主机、端口与协议是否与预先定义好的相匹配. 比如, 可以验证挑战是从使用 SSL、端口号为 443 的特定主机发出的. 只要不满足其中任何一个条件, 代码就会立刻向用户发出警告, 告诉用户无法建立安全的连接.