iOS开发ASIHTTPRequest身份验证

移动开发 iOS
本文为大家介绍了iOS开发ASIHTTPRequest身份验证的内容,其中包括为URL指定要使用的用户名和密码,为request指定要使用的用户名和密码,将凭据存储到keychain,将凭据存储到session中,NTLM授权,使用代理来提供凭据,使用内建的授权对话框(目前只对iOS有效),在服务器请求凭据前向服务器发送凭据等等内容。

本文为大家介绍了iOS开发ASIHTTPRequest身份验证的内容,其中包括为URL指定要使用的用户名和密码,为request指定要使用的用户名和密码,将凭据存储到keychain,将凭据存储到session中,NTLM授权,使用代理来提供凭据,使用内建的授权对话框(目前只对iOS有效),在服务器请求凭据前向服务器发送凭据等等内容。

ASIHTTPRequest是简单易用的,它封装了CFNetwork API。使得与Web服务器通信变得更简单。它是用Objective-C编写的,可以在MAC OS X和iPhone应用中使用。

你可以查阅下图ASIHTTPRequest授权流程图来了解ASIHTTPRequest如何找到授权凭据,并将授权凭据应用到request上。

为URL指定要使用的用户名和密码

  1. NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com/"]; 
  2. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 

为request指定要使用的用户名和密码

  1. NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com/"]; 
  2. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
  3. [request setUsername:@"username"]; 
  4. [request setPassword:@"password"]; 

将凭据存储到keychain

如果打开了keychainPersistence,所有提供的可用的用户名和密码将被存储到keychain中,以后的request将会重用这些用户名密码,即使你关闭程序后重新打开也不影响。

  1. NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com/"]; 
  2. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
  3. [request setUseKeychainPersistence:YES]; 
  4. [request setUsername:@"username"]; 
  5. [request setPassword:@"password"]; 

如果你使用keychain但是想要自己管理它,你可以在ASIHTTPRequest.h文件里找到相关的类方法。

将凭据存储到session中

如果打开了useSessionPersistence(默认即是如此),ASIHTTPRequest会把凭据存储到内存中,后来的request将会重用这些凭据。

  1. NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com/"]; 
  2. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
  3. [request setUsername:@"username"]; 
  4. [request setPassword:@"password"]; 
  5. [request setUseSessionPersistence:YES]; //这一项是默认的,所以并不必要 
  6.  
  7. //将会重用我们的 username 和 password 
  8. request = [ASIHTTPRequest requestWithURL:url]; 

NTLM授权

要使用NTLM授权的Windows服务器,你还需要指定你要进行授权域。

  1. NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com/"]; 
  2. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
  3. [request setUsername:@"username"]; 
  4. [request setPassword:@"password"]; 
  5. [request setDomain:@"my-domain"]; 

使用代理来提供凭据

你不一定非要提前指定授权凭据,你还可以让每个request在无法从session或keychain中找到凭据时向它们的代理请求凭据。如果你要连接到一个你并不清楚授权类型的服务器时,这是很有用的。

你的delegate必须实现authenticationNeededForRequest:方法,当request等待凭据时,ASIHTTPRequest将会暂停这个request。如果你持有你需要的凭据,那么先为request设定凭据,然后调用[request retryUsingSuppliedCredentials]即可。如果你想取消授权,调用[request cancelAuthentication],此时,这个request也会被取消。

从1.0.8版开始,一次只能有一个request的delegate收到authenticationNeededForRequest: 或者 proxyAuthenticationNeededForRequest:。当delegate处理第一个request时,其他需要授权的request将会被暂停。如果提供了一个凭据,当前进程中所有其他的request将会假定这个凭据对这个URL有效,并尝试重用这个凭据。如果delegate取消了授权,并且队列的shouldCancelAllRequestsOnFailure值为YES,所有其他的request都将被取消(它们也不会尝试请求凭据)。

当进行同步请求时,你不可以使用代理模式来授权。

在较老的版本中,这么做会导致程序假死,从1.0.8开始,即使你这么做了,代理函数也不会被调用。

使用内建的授权对话框(目前只对iOS有效)

这个特性归功于1.0.8版本的新类ASIAuthenticationDialog 。这个特性主要是用于授权代理(后面会介绍到),但是它也可以用来向用户取得授权凭据。

为了更好的用户体验,大多数(连接单一服务的)app必须为request的delegate实现authenticationNeededForRequest:方法,或者避免同时使用代理式授权。

most apps that connect to a single service should implement authenticationNeededForRequest: in their request delegates, or avoid the use of delegation-style authentication altogether.

但是,会有一些情况下,为普通的授权使用ASIHTTPRequest的标准授权对话框更好:

  • 你不想创建你自己的登录表单
  • 你可能需要从外部资源获取数据,但是你不清楚你需不需要进行授权

对于这些情况,为request设置shouldPresentAuthenticationDialog为YES,此时,如果你的代理没有实现

authenticationNeededForRequest:方法,那么用户将会看到这个对话框。

一次同时只有一个对话框可以显示出来,所以当一个对话框显示时,所有其他需要授权的request将会暂停。如果提供了一个凭据,当前进程中所有其他的request将会假定这个凭据对这个URL有效,并尝试重用这个凭据。如果delegate取消了授权,并且队列的shouldCancelAllRequestsOnFailure值为YES,所有其他的request都将被取消(它们也不会尝试请求凭据)。

对于同步请求的request,授权对话框不会显示出来。

这个对话框部分模仿了iPhone上Safari使用的授权对话框,它包含以下内容:

  • 一段信息来说明这些凭据是用于websever(而非一个proxy)
  • 你将要连接到服务器的主机名或者IP
  • 授权域(如果提供的话)
  • 填写用户名和密码的区域
  • 当连接到NTLM授权模式的服务器时,还会包含一个填写domain的区域
  • 一个说明信息,指明凭据是否将会被以明文方式发送(例如:“只有当使用基于非SSL的基本授权模式时才会以明文方式发送”)

如果你想改变它的外观,你必须继承ASIHTTPRequest,并重写showAuthenticationDialog来显示你自己的对话框或ASIAuthenticationDialog子类。

在服务器请求凭据前向服务器发送凭据

IMPORTANT

从1.8.1开始,使用基本授权模式的request时,这个特性的行为改变了。你可能需要修改你的代码。

在第一次生成request时,ASIHTTPRequest可以先向服务器发送凭据(如果有的话),而不是等服务器要求提供凭据时才提供凭据。这个特性可以提高使用授权的程序的执行效率,因为这个特性避免了多余的request。

对于基本授权模式,要触发这个行为,你必须手动设置request的authenticationScheme为kCFHTTPAuthenticationSchemeBasic:

  1. [request setAuthenticationScheme:(NSString *)kCFHTTPAuthenticationSchemeBasic]; 

对于其他授权方案,凭据也可以在服务器要求之前被发送,但是仅当有另一个request成功授权之后才行。

在以下情况下,你也许想要禁用这个特性:

  • 你的程序可能会一次使用一系列凭据来与服务器对话
  • 安全性对于你的程序来说非常重要。使用这个特性是相对不安全的,因为你不能在凭据被发送前验证你是否连接到了正确的服务器。

要禁用这个特性,这样做:

  1. [request setShouldPresentCredentialsBeforeChallenge:NO];
责任编辑:闫佳明 来源: dreamingwish
相关推荐

2010-09-06 11:24:47

CHAP验证PPP身份验证

2012-04-10 09:36:58

2011-02-21 10:54:45

2010-11-30 15:31:38

SharePoint Kerberos

2010-07-17 00:57:52

Telnet身份验证

2021-07-19 10:10:15

身份验证漏洞Windows Hel

2010-11-03 16:07:38

DB2身份验证

2013-07-22 14:38:00

iOS开发ASIHTTPRequ

2013-07-21 18:22:59

iOS开发ASIHTTPRequ

2013-07-21 18:27:15

iOS开发ASIHTTPRequ

2013-07-21 18:18:00

iOS开发ASIHttpRequ

2012-10-23 16:12:35

2015-01-28 10:00:49

2011-05-10 09:09:36

身份验证HID Global

2021-08-30 14:23:41

身份验证隐私管理网络安全

2024-02-02 08:56:54

2009-07-29 12:55:44

ASP.NET身份验证

2021-06-03 08:56:34

密码身份验证无密码

2010-10-27 16:59:59

2018-10-23 15:31:12

点赞
收藏

51CTO技术栈公众号