个NSURLProtectionSpace提供如下信息:

//401的认证方式的realm字段的值

(NSString*)realm;

//401的认证方式,指定是否密码发送安全。

-(BOOL)receivesCredentialSecurely;

//代理授权

-(BOOL)isProxy;

//服务端主机地址,如果是代理则代理服务器地址

-(NSString *)host;

//服务端端口地址,如果是代理则代理服务器的端口

-(NSInteger)port;

//代理类型,只对代理授权,比如http代理,socket代理等。

-(NSString *)proxyType;

//使用的协议,比如http,https, ftp等,

-(NSString *)protocol;

//最关键字段,指定授权方式,比如401,客户端认证,服务端信任,代理等。

-(NSString *)authenticationMethod;

//客户端认证,是指定可接受的客户端证书列表??表示只有这些证书才可以??

-(NSArray *)distinguishedNames NS_AVAILABLE(10_6,3_0);

//用于服务端信任,指定一个信任对象,可以用这个对象来建立一个凭证。

-(SecTrustRef)serverTrust NS_AVAILABLE(10_6,3_0);

保护空间的建立提供2个方法:

(id)initWithHost:(NSString*)host port:(NSInteger)port protocol:(NSString *)protocolrealm:(NSString *)realm authenticationMethod:(NSString*)authenticationMethod;

//代理的保护空间

-(id)initWithProxyHost:(NSString*)host port:(NSInteger)port type:(NSString *)type realm:(NSString*)realm authenticationMethod:(NSString *)authenticationMethod;

好了有了保护空间类,也凭证类我们就可以把信息从凭证空间读取或者保存了,凭证空间提供了如下的方法:

//根据保护空间得到凭证对象字典,这个字典的key是用户名,而value是NSURLCredential

-(NSDictionary *)credentialsForProtectionSpace:(NSURLProtectionSpace*)space;

//所有凭证对象字典,key是保护空间,value是一个字典,其中value的key是用户名字,value是凭证

-(NSDictionary *)allCredentials;

//保存凭证

-(void)setCredential:(NSURLCredential*)credential forProtectionSpace:(NSURLProtectionSpace *)space;

//删除凭证

-(void)removeCredential:(NSURLCredential*)credential forProtectionSpace:(NSURLProtectionSpace *)space;

//设置某个保护空间的默认凭证

-(NSURLCredential*)defaultCredentialForProtectionSpace:(NSURLProtectionSpace *)space;

//获取某个凭证空间的默认凭证

-(void)setDefaultCredential:(NSURLCredential*)credential forProtectionSpace:(NSURLProtectionSpace *)space;

当我们的凭证存储空间有变化时会发送FOUNDATION_EXPORTNSString *constNSURLCredentialStorageChangedNotification;通知。

好了说了这么多,然我们来继续看看挑战类吧NSURLAuthenticationChallenge,一个挑战类会包含:保护空间信息,凭证类(如果有的话),

我们再来捋顺一下逻辑,当我们发送请求到服务端时,服务端需要我们挑战时会在客户端创建一个挑战对象NSURLAuthenticationChallenge,其中的保护空间NSURLProtectionSpace由服务器响应的信息来构建,而<NSURLAuthenticationChallengeSender>sender则内部构建,然后挑战对象会根据保护空间从凭证存储中获取对应的凭证对象,如果有凭证对象则会把凭证对象赋值给数据成员proposedCredential,建立挑战对象后判断当前有没有实现NSURLConnection的willSendRequestForAuthenticationChallenge的函数,如果没有实现则根据凭证对象来调用sender的接受挑战或者失败函数,而如果是我们实现了willSendRequestForAuthenticationChallenge就需要我们自己来处理如何接收挑战了,注意当我们调用sender的接收挑战函数,这个函数内部会把凭证和保护空间保存到凭证存储中去,以便下次继续使用(当然可以通过控制凭证的持久属性来决定是否保存)。因此有的时候我们可以在系统中预先植入一些特定服务器的保护空间和凭证,这样我们就不需要去处理willSendRequestForAuthenticationChallenge函数了,这种机制特别有效的用于处理webview来访问有些需要授权的或者https或者代理等等。

http://blog.csdn.net/antjumper/article/details/51567945

NSURLProtectionSpace 证书认证的上下文的更多相关文章

  1. JAVA中SSL证书认证通讯

    JAVA中SSL证书认证通讯 SSL通讯服务端 /******************************************************************** * 项目名称 ...

  2. tomcat 配置客户端证书认证

    在完成配置客户端证书认证后,浏览器以https访问服务器的时候,会提示选择证书,之后,服务器端会验证证书.也就意味着只有拥有有效证书的客户端才能打开该网站. 以下是具体的配置过程. 1. 在服务器端生 ...

  3. 不同服务器之间使用svn钩子post-commit同步代码遇到的证书认证问题.md

    遇到的问题,以下其他问题都是因解决这个问题引申出来的问题 VisualSVN hooks自动同步更新到web服务器 错误信息如下: Error validating server certificat ...

  4. QT https post请求(QNetworkRequest要设置SSL证书,而SSL证书认证有三种,实测成功)

    以VS开发为例.因为https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在使用之前必须先做一些准备工作: 需要安装OpenSSL库: 1.首先打开http://slproweb.com ...

  5. APK安装时的过滤方式:包名白名单、证书认证

    1.定义一些全局变量,文件位置: Build.java (frameworks\base\core\java\android\os) /** * 包管理方式名称<br> * whiteli ...

  6. Https握手协议以及证书认证

    1. 什么是https Https = http + 加密 + 认证 https是对http的安全强化,在http的基础上引入了加密和认证过程.通过加密和认证构建一条安全的传输通道.所以https可以 ...

  7. UIWebView 跳过HTTPS证书认证

    UIWebView跳过证书认证 在UIWebView中加入如下代码即可(Error Domain=NSURLErrorDomain Code=-1202) //跳过证书验证 @interface NS ...

  8. QT https post请求(QNetworkRequest要设置SSL证书,而SSL证书认证有三种)

    因为https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在使用之前必须先做一些准备工作: 需要安装OpenSSL库: 1.首先打开http://slproweb.com/product ...

  9. SSL通信-忽略证书认证错误

    .NET的SSL通信过程中,使用的证书可能存在各种问题,某种情况下可以忽略证书的错误继续访问.可以用下面的方式跳过服务器证书验证,完成正常通信. 1.设置回调属性ServicePointManager ...

随机推荐

  1. 如何将变量id添加到jquery的选择器中

    今天在做广州仲裁委员会的系统时这样的一个需求,需要在页面一加载的时候查询各个项目的案件数,这里有很多个项目,一开始我是这样写的: 代码如下: $.get(assignedCaseUrl,functio ...

  2. java中静态资源处理方法

    方案一:激活Tomcat的defaultServlet来处理静态文件 在 web.xml 中添加: <servlet-mapping> <servlet-name>defaul ...

  3. HIHO 16 B

    卡了~卡了就写不下去了~其实是不会~ 大牛提醒,答案必定是SUM的因子~细细想了好久,才想通~差距~ 因为是所有的和GCD,所以GCD必定整除SUM.. 然后,枚举这些因子,统计前缀和的MOD,看有多 ...

  4. STM32的独立看门狗

    STM32 内 部自带了 2 个看门狗:独立看门狗(IWDG)和窗体看门狗(WWDG) STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动.即使主时钟发生问题.它也仍然 有效. 这里须要注 ...

  5. 【Unity3D】 KeyCode 键码

    Key codes returned by Event.keyCode. These map directly to a physical key on the keyboard. KeyCode是由 ...

  6. compact处理流程分析

    compact处理流程分析 compact的处理与split同样.由client端与flush时检查发起. 针对compact另一个在rs生成时生成的CompactionChecker线程定期去检查是 ...

  7. 关注C-RAN 的五大理由

     关注C-RAN的五大理由 Scott Wakelin 近期行业媒体上有大量关于移动网络运营商(如美国的VerizonWireless和AT&T.法国电信以及中国移动等)怎样在着力探索一种 ...

  8. bzoj4950: [Wf2017]Mission Improbable

    跟着靖靖做题%%%%% 这题一看就觉得和之前的某场模拟赛的一道题很像,找假如某行某列的最大值一样的就可以只堆一个,跑匈牙利就行 一开始以为箱子不能移动-_-! 然后有个坑,大家都知道当这个位置有箱子就 ...

  9. 查看服务器wwn是否在交换机侧

    判断port_state是否为Online状态,是的话,读取出port_name,即为wwn. #!/usr/bin/env python3 # -*- coding: UTF-8 -*- impor ...

  10. google搜索引擎使用方法

    搜索引擎命令大全!这是一个我最喜欢的Google搜索技巧的清单: link:URL = 列出到链接到目标URL的网页清单. related:URL = 列出于目标URL地址有关的网页. site:ht ...