我有一个内部PHP应用程序(仅适用于使用域网络的员工)在IIS上运行,并使用匿名身份验证。
用户登录应用程序的方式是通过登录表单(用户名和密码)。
这就是我禁用Windows身份验证而只启用匿名身份验证的原因。
但是现在有一个请求,要求能够保存失败的登录尝试和失败的用户。为此,我想获得正在尝试连接的实际Windows用户。
在我的另一个应用程序中,我使用了Windows身份验证,所以我知道我可以使用PHP的$_SERVER['AUTH_USER'];
获得Windows用户
所以,我想在这个应用程序上添加该功能,并启用了Windows身份验证。但是,如果同时启用了Windows身份验证和匿名身份验证,则$_SERVER['AUTH_USER'];
将返回空字符串。
然后,我禁用了匿名身份验证,瞧!它向我显示了Windows用户。此外,登录表单还可以继续工作,即用户仍然需要输入他的用户名和密码。
所以我很困惑-Windows身份验证是如何工作的?它到底要验证什么?由于没有密码或任何东西,它只给了我Windows用户名。
我现在是否基本上拥有“两层”身份验证?通过Windows身份验证进行“服务器”级身份验证,以及“应用程序”级身份验证(登录表单)?(但话说回来,Windows身份验证的具体作用是什么?)
那么,我是否可以安全地禁用匿名身份验证?
2条答案
按热度按时间vdzxcuhz1#
提供了一个替代答案,没有理解Windows身份验证时的典型错误。
1.当您要启用其他IIS身份验证方法(如Windows/Basic/Digest(所有三种都是基于质询的身份验证))时,不能保持匿名身份验证处于打开状态。这是因为匿名身份验证在启用时具有最高优先级,并且浏览器不会被其他方法所挑战。
1.您可以使用不同的方法对用户进行身份验证,例如IIS上的Windows身份验证和PHP代码中基于表单的身份验证。但是,如果它们都验证相同的AD用户凭据,则不会获得任何额外的保护。
要获得更多保护,您应该使用双/多因素身份验证方法。
1.要了解什么是Windows身份验证,这是相当复杂的,您最好与域管理员交谈,并学习非常具体的材料(如IIS/AD书籍)。微软有像this这样的东西可以让你入门,但你很容易迷失方向。简而言之,由于域控制器参与了Windows身份验证过程,因此浏览器不需要向IIS发送显式的用户密码,而是发送安全令牌。一旦接收到令牌,IIS就知道它属于哪个用户,PHP代码也知道这一点。
在这个阶段,我不想谈论Kerboros/NTLM/SSO,因为如果不完全理解上面的内容,你就不容易理解它们。
yhived7q2#
它到底能鉴定什么。。
它确保请求来自一个登录的Windows用户,该用户在与IIS服务器相同的域中有效,并且不是匿名的,或者以某种方式来自域外部。它根据Active Directory记录检查他们的凭据。你可以很容易地在网上阅读更多关于它的信息,包括对它所遵循的过程的深入解释。
在IIS中,可以将站点配置为在后台使用Kerberos(默认)或NTLM来提供实际的身份验证机制。
我可以安全地离开匿名身份验证禁用然后.
假设您不需要/不希望任何非有效域用户访问您的应用程序,那么是的。
我现在基本上有“两层”的身份验证...
是的。您可能需要考虑基于表单的身份验证过程是否实际上是必要的,如果您可以从AD帐户自动识别用户,而无需他们在您的应用程序中键入任何内容,或者记住任何额外的用户名和密码等。从本质上讲,它是SSO(单点登录)的一种形式,尽管它只在Windows域中工作。
一些有用的参考资料,让你开始: