我正在使用FOSUserBundle配置Symfony2应用程序以使用http_digest
身份验证。这是Symfony 2.1.0-BETA2。
在security.yml中,我只是为http_basic
切换http_digest
并添加所需的key
属性。其他一切都是一样的。
有效的相关配置:
firewalls:
main:
pattern: ^/
anonymous: ~
form_login: false
provider: fos_user_bundle
http_basic:
realm: "Example Realm"
不起作用的相关配置:
firewalls:
main:
pattern: ^/
anonymous: ~
form_login: false
provider: fos_user_bundle
http_digest:
realm: "Example Realm"
key: "%secret%"
正如您所看到的,唯一的区别是为http_basic
切换http_digest
。更改key
属性的值似乎没有区别。
使用in_memory提供程序时,http_digest
工作正常。只有在使用fos_user_bundle
提供商时才会出现此问题。
通过工作,我的意思是在使用http_basic
时,接受有效的用户凭据。使用http_digest
时,不接受相同的有效用户详细信息,并重新显示浏览器的默认http身份验证提示。
在安全配置更改之间,我清除dev和prod缓存,清空浏览器缓存并关闭浏览器。
配置中是否缺少一些重要的东西?
更新
我已经记录了一次成功的http_basic尝试和一次不成功的http_digest尝试,并将日志分开。
两个日志都是相同的,包括Doctrine记录用于身份验证的SQL查询的位置。
http_digest日志中的身份验证查询后面是行:
security.DEBUG: Expected response: '3460e5c31b09d4e8872650838a0c0f1a' but received: '5debe5d0028f65ae292ffdea2616ac19'; is AuthenticationDao returning clear text passwords? [] []
security.INFO: exception 'Symfony\Component\Security\Core\Exception\BadCredentialsException' with message 'Incorrect response' in /home/jon/www/local.app.simplytestable.com/vendor/symfony/symfony/src/Symfony/Component/Security/Http/Firewall/DigestAuthenticationListener.php:105
密码使用FOSUserBundle进行加盐和散列。
我想确定这件事是由于我的错误配置还是因为它是FOSUserBundle中的错误而引起的。
答案 0 :(得分:6)
简而言之,HTTP摘要式身份验证可以通过比较根据包括用户名,领域,密码以及各种nonse和replay-avoidance值的值计算出的哈希值来实现。
客户端和服务器端都需要明文密码才能生成相同的哈希值。
FOSUserBundle
盐和哈希密码。
在Symfony\Component\Security\Http\Firewall\DigestAuthenticationListener
类中生成的服务器端哈希将传递散列而不是明文密码,因此永远不会生成正确的哈希值进行比较。