与 Kerberos、IE、Firefox、LDAP Active Directory 的无缝 SSO

Bra*_*rad 6 php active-directory ldap kerberos apache-2.2

Alias /students /var/www/students

<Location /students>
  KrbServiceName HTTP
  KrbMethodNegotiate On
  KrbMethodK5Passwd On
  KrbSaveCredentials off
  KrbAuthRealms DOMAIN.LOCAL
  Krb5KeyTab /etc/httpd/keytab
  KrbAuthoritative off

  AuthType Kerberos
  AuthName "Please Login"
  AuthBasicProvider ldap
  AuthzLDAPAuthoritative on
  AuthLDAPURL "ldap://dc.domain.local:389/OU=Domain Users,DC=domain,DC=local?userPrincipalName?sub?(objectClass=*)"
  AuthLDAPBindDN "CN=ldapsearchuser,CN=Users,DC=domain,DC=local"
  AuthLDAPBindPassword ldapsearchuserpass
  require ldap-group CN=Students,CN=Users,DC=domain,DC=local
  require ldap-group CN=Staff,CN=Users,DC=domain,DC=local
</Location>
Run Code Online (Sandbox Code Playgroud)

这允许所有属于学生/教职员工 AD 组的用户访问http://intranetsite/students后面的页面,而无需指定登录凭据,前提是他们的 IE/Firefox 配置正确。

使用 userPrincipalName 而不是 sAMAccountName 因为 kerberos 模块将 username@REALM 传递给 ldap 模块。

现在我遇到的问题是,如果有人未经授权,他们会看到:

需要授权 此服务器无法验证您是否有权访问所请求的文档。要么您提供了错误的凭据(例如,错误的密码),要么您的浏览器不了解如何提供所需的凭据。

有谁知道如何让它弹出用户名/密码对话框,以便他们可以尝试替代凭据?在未成功获得授权后,我可以让它要求凭据的唯一方法是清除我的缓存。如果我以经过身份验证的用户身份登录到 PC,但没有获得此资源的授权,我将无法提供备用凭据(这可能是一件好事)。

Mat*_*hew 3

我们面临着非常相似的问题。我们最终得出的结论是,虽然 Internet Explorer 和 Firefox 中集成的 NTLM 登录支持很方便,但有很多异常情况会导致失败,因此我们改变了方法。

集成身份验证的问题在于,它仅在当前登录的用户名和密码仍然正确并且被正确授权访问资源时才有效。

但还有更多情况下它不起作用:

  • 如果用户名和/或密码不正确,则无法使用上面所述的备用凭据
  • 如果帐户和/或密码已过期或密码错误,浏览器将返回“未经授权”消息,但不知道是哪一个问题

我们标准化的方法是建立一个接受凭据的用户名/密码登录网页(在应用程序前面)。提交凭据后,应用程序将依次根据目录验证这些凭据,然后做出相应的响应(在 .NET 世界中,您可以使用表单身份验证http://msdn.microsoft.com/en-us/library/aa480476)。 aspx强制通过此登录页面访问应用程序)。由于应用程序正在执行凭据验证,因此您可以获得有关登录失败性质的丰富信息。另外,即使登录成功但有相关信息要显示给用户,例如他们的密码即将过期等,这也提供了这样做的机会。

更新:我忘了提及,如果您采用这种方法,您将需要允许匿名访问 IIS 应用程序根目录。这将允许访问登录网页,而无需首先尝试自动 NTLM 身份验证。是否启用 NTLM 身份验证取决于您;也许您确实希望某些客户端仍然自动登录。