在iPhone上使用HTTP摘要式身份验证

我有一个与使用HTTP摘要认证的服务器进行通信的应用程序。

在我看来,iPhone内的'会话'管理对我们的开发人员来说是相当“黑匣子”。 是不是真的,我们看不到框架如何处理/持续HTTP会话?

如果我只是在这里昏迷,有人会关心解释如何处理iPhone上的HTTP摘要认证?

我的基本运行是:

  • 向安全的网址发送请求
  • 服务器发送一个401
  • 客户端创建并保留一个凭证,并将其传回服务器
  • 服务器验证凭证,如果验证完成请求,如果不是则发送另一个401。
  • 进行后续请求以保护网址
  • 服务器再次请求授权........
  • 这适用于单个请求,但如果我进行额外的后续请求,服务器会再次请求授权。 服务器为特定用户保留了一个会话,但由于某种原因,iPhone在同一个会话中没有发出请求...因此,服务器必须丢弃身份验证对象,并且每次客户端创建一个新的向安全的网址发送请求。

    我相信这是不正确的行为。

    如果我们看看浏览器在这种情况下的行为如何:

  • 浏览器从安全网址请求数据
  • 服务器发送401
  • 浏览器提示用户输入凭证,将其保存并传递给服务器
  • 服务器验证凭证,如果验证返回数据,如果不是则发送另一个401。
  • 由于浏览器管理会话,因此不会提示后续对安全网址的请求提供凭据。
  • 我正在创建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

    上一篇: Using HTTP Digest Authentication on the iPhone

    下一篇: Secure Communication Between iPhone and Server?