使用AuthType Digest跨子域对用户进行一次身份验证的示例?

时间:2008-12-10 23:09:35

标签: apache authentication subdomain single-sign-on digest

我有一个域名,可由一小群私人访问。所以我想通过身份验证来控制访问。

域中安装了一组应用程序,每个应用程序都有自己的子域。例如:domain.com,app1.domain.com,app2.domain.com,app3.domain.com

我希望拥有一个单点登录解决方案,这样他们就无需为每个应用程序验证自己。此外,应用程序使用不同的语言(PHP,Python和Perl)编写,因此通过Apache模块对用户进行身份验证是理想的。

我是消化身份验证的新手,但它似乎是一个很好的解决方案。我使用htdigest来创建我的用户。我已经配置了我的域和子域(见下文)。

如果我转到域或任何子域,它将提示输入用户名和密码。如果我输入正确的用户名和密码,它将验证我的身份并加载页面。但是,如果我转到另一个子域,它会要求我再次输入用户名和密码。如果我输入相同的用户名和密码,它将起作用。

所以密码文件没问题,验证也没问题,但问题似乎在于AuthDigestDomain的配置。

我在网上搜索了一个在多个域上使用摘要式身份验证的示例,但我找不到解决我问题的具体示例。

我希望有人可以提供帮助。我是否在每个Directory中添加相同的身份验证信息?我应该使用DirectoryLocation还是Files?我是否一起错过了什么?

提前致谢!

以下是我对domain.com的Apache配置示例:

<Directory /var/www>
  AuthType Digest
  AuthName "realm"
  AuthDigestAlgorithm MD5
  AuthDigestDomain / http://domain.com/ http://app1.domain.com/ http://app2.domain.com/ http://app3.domain.com/
  AuthDigestNcCheck Off
  AuthDigestNonceLifetime 0
  AuthDigestQop auth
  AuthDigestProvider file
  AuthUserFile /etc/apache2/.htpasswd-digest
  AuthGroupFile /dev/null
  Require valid-user
</Directory>

这是app1.domain.com的一个例子:

<Directory /var/lib/app1>
  AuthType Digest
  AuthName "realm"
  AuthDigestAlgorithm MD5
  AuthDigestDomain / http://domain.com/ http://app1.domain.com/ http://app2.domain.com/ http://app3.domain.com/
  AuthDigestNcCheck Off
  AuthDigestNonceLifetime 0
  AuthDigestQop auth
  AuthDigestProvider file
  AuthUserFile /etc/apache2/.htpasswd-digest
  AuthGroupFile /dev/null
  Require valid-user
</Directory>

更令人困惑的是,这在使用IE6时有效,但在Firefox或Chrome中无效。是客户端没有正确发送身份验证,还是服务器没有发送正确的凭据?

我一直在阅读RFC 2617并使用PHP编写身份验证标头,以确保请求/响应质询是正确的。这根本没有帮助!

3 个答案:

答案 0 :(得分:3)

大多数浏览器不尊重摘要“域”指令,也不会重新发送其他URI的凭据。据我所知,Opera是唯一一个尊重它的浏览器。

对于Opera,服务器必须为域列表中的每个URI使用相同的“realm”字符串进行响应。换句话说,如果domain =“/ test / example”,服务器需要在两个URI的WWW-Authenticate标头中发送“Test Realm - example.com”。我认为Opera这样做是因为它存储了H(A1)而不是实际的安全密码。有关详细信息,请阅读RFC2617。

以下是我对此问题的跨浏览器解决方案:http://travisce.com/arest/

答案 1 :(得分:0)

我自己没有这样的经历。但我刚看了Apache documentation并发现了这个:

  

AuthDigestNonceLifetime指令   控制服务器随机数的长度   有效。 [...]如果秒小于0   然后nonce永不过期。

所以在我看来,0秒(你正在使用的值)是非法的,或者真的告诉Apache在0秒后使nonce失效,这将准确地解释你正在进行的行为。

答案 2 :(得分:0)

AuthDigestDomain上的通配符可以帮助吗?

    *.domain.com