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>
这允许所有属于学生/教职员工 AD 组的用户访问后台页面http://intranetsite/students只要 IE/Firefox 配置正确,无需指定登录凭据。
使用 userPrincipalName 而不是 sAMAccountName 是因为 kerberos 模块将 username@REALM 传递给 ldap 模块。
现在我遇到的问题是,如果某人未获得授权,则会出现以下情况:
需要授权 此服务器无法验证您是否有权访问所请求的文档。您提供的凭据有误(例如密码错误),或者您的浏览器无法提供所需的凭据。
有人知道如何让它弹出用户名/密码对话框,以便他们可以尝试备用凭据吗?在未成功获得授权后,我让它要求提供凭据的唯一方法是清除缓存。如果我以经过身份验证但未获得此资源授权的用户身份登录 PC,则无法提供备用凭据(这可能是一件好事)。
答案1
我们遇到了非常相似的问题。我们最终得出结论,虽然 Internet Explorer 和 Firefox 中集成的 NTLM 登录支持很方便,但有太多异常情况会导致失败,因此我们改变了方法。
集成身份验证的问题在于,只有当当前登录的用户名和密码仍然正确且被正确授权访问资源时,它才有效。
然而,在更多情况下它不起作用:
- 如果用户名和/或密码不正确,则无法使用上述替代凭证
- 如果账户和/或密码已过期,或者密码错误,浏览器将返回“未经授权”的消息,但不知道是哪个问题
我们标准化的方法是建立一个用户名/密码登录网页(在应用程序前面),该网页接受凭据。提交凭据后,应用程序将依次根据目录验证这些凭据,然后做出相应的响应(在 .NET 世界中,您可以使用表单身份验证http://msdn.microsoft.com/en-us/library/aa480476.aspx强制通过此登录页面访问应用程序)。由于应用程序正在进行凭据验证,因此您可以获得有关登录失败性质的丰富信息。此外,即使登录成功,但有相关信息要显示给用户,例如他们的密码将很快过期等,这也提供了这样做的机会。
更新:我忘了说,如果您采用这种方法,您需要允许匿名访问 IIS 应用程序根目录。这将允许访问登录网页,而无需先尝试自动 NTLM 身份验证。是否启用 NTLM 身份验证取决于您;也许您确实希望某些客户端仍能自动登录。