在iPhone上使用HTTP摘要式身份验证
我有一个与使用HTTP摘要认证的服务器进行通信的应用程序。
在我看来,iPhone内的'会话'管理对我们的开发人员来说是相当“黑匣子”。 是不是真的,我们看不到框架如何处理/持续HTTP会话?
如果我只是在这里昏迷,有人会关心解释如何处理iPhone上的HTTP摘要认证?
我的基本运行是:
这适用于单个请求,但如果我进行额外的后续请求,服务器会再次请求授权。 服务器为特定用户保留了一个会话,但由于某种原因,iPhone在同一个会话中没有发出请求...因此,服务器必须丢弃身份验证对象,并且每次客户端创建一个新的向安全的网址发送请求。
我相信这是不正确的行为。
如果我们看看浏览器在这种情况下的行为如何:
我正在创建NSURLCredential并将其保存在NSURLCrendtialStorage中。 然后,当应用程序收到“didReceiveAuthenticationChallenge”时,我从存储中检索凭证并将其传回,如果凭证不存在(在第一次请求时),则创建该凭证。
任何帮助将不胜感激。 谢谢。
首先,忘记HTTP会话,因为这些会话不与Digest身份验证活动登录进行交互(有一种会话信息能力,但它不同)。
事实上,使用Digest的主要原因之一就是不必为了保持登录状态而使用会话。 会话很重,并且会影响可伸缩性。
我无法确定你的问题是什么,但我确实知道我要先检查什么,这是正确使用陈旧和正确的随机创建。
用户代理只能处理身份验证,而不会在用户被要求处理相同的随机数时重新询问用户,或者在另一种情况下,我会稍后再来(更容易按此顺序解释)。
如果您在每个请求中使用相同的随机数,那么用户代理将继续将它与来自用户/传递的“ha1”一起用于请求后续资源。 这是事先做好的,所以挑战永远不会发生。
当然,使用相同的nonce会带来不安全因素,因为任何可以嗅探流量的重放攻击都变得微不足道。 Nonces将不得不定期更换。
因此,如果您从用户代理接收到具有无效授权标头的请求,但其无效的原因是该随机数错误(它使用的是过期的),那么在您的挑战中包含“stale = true”(默认为假)。 这会通知用户代理您的拒绝原因是过时的(当然,其他信息也可能是错误的,但这并不重要,因为您不会让它以任何方式播放)。
在收到这样一个stale = true时,用户代理将知道它没有被授权,但是不重新请求用户(或者如果它是一个没有UI的组件,则抛出一个异常)会用新的随机数重试旧标准。
我不知道这是否有什么影响你,但是确定和显示随机和陈旧的方式当然是我首先要看的东西。
我写了一个带有HTTP身份验证的iPhone应用程序,并且体验了您所描述的内容 (我的应用程序使用基本身份验证而不是摘要身份验证,但这并没有太大区别。)
问题的原因是在iPhone端。 如果iPhone不在HTTP请求标头中发送凭证,则服务器需要用401回答。 事实上,即使证书存储在证书存储中后,它也不会轻易实现。
这种奇怪的行为对应用程序的速度产生了严重影响,因为每个请求都会导致服务器的两次往返而不是一次(第一次使用状态401,第二次使用200)。
我已经通过手动设置HTTP请求头中的凭据来解决它:
NSString* credentials = [NSString stringWithFormat: @"%@:%@", usr, pwd];
const char* credentialsChars = [credentials cStringUsingEncoding: NSUTF8StringEncoding];
credentials = [CommunicationUtil stringBase64WithData: (const UInt8*) credentialsChars length: strlen(credentialsChars)];
NSString* authorizationHeader = [NSString stringWithFormat: @"Basic %@", credentials];
NSMutableURLRequest* request =
[[NSMutableURLRequest alloc] initWithURL: url
cachePolicy: NSURLRequestReloadIgnoringLocalCacheData
timeoutInterval: 15];
[request setValue: authorizationHeader forHTTPHeaderField: @"Authorization"];
现在我的应用程序工作非常顺利,响应速度非常快
对于摘要式身份验证,解决方案看起来略有不同。 但你会明白的。
链接地址: http://www.djcxy.com/p/43099.html