使用Windows身份验证模块的IIS条件身份验证



我遇到了一种不寻常的情况,在这种情况下,身份验证是不必要的,但在某些条件下,通过windows身份验证学习用户id会很有用。

为了提供一些上下文,我希望能够在用户代理匹配某些条件时要求windows身份验证,但在其他条件下不要求身份验证。由于对asp.net和iis只有一些熟悉,我怀疑我错过了一种简单的方法来实现这一点。到目前为止,我已经考虑编写一个模块来检查用户代理,然后在满足条件的情况下添加WindowsAuthenticationModule,但我不知道如何做到这一点。

对用户代理的值进行身份验证或不进行身份验证的最佳方式有什么建议吗?

如果您将IIS设置为使用windows身份验证,那么您应该能够执行以下代码片段。

然而,正如你可能从代码中的注释中猜到的那样,我建议不要这样做。用户代理很容易被欺骗,因此你基于它进行的任何身份验证检查也很容易被绕过。这同样适用于http标头中出现的任何内容(例如,基于http referrer的身份验证也是个坏主意)。

string windowsUserName = null;
var currentContext = System.Web.HttpContext.Current;
//NOT SECURE - easily spoofed!
if (currentContext.Request.UserAgent == "Some special user agent")
{
    if (!currentContext.User.Identity.IsAuthenticated 
        || currentContext.User.Identity.AuthenticationType != "Windows")
    {
        throw new SecurityException(@"You are not authorized, but you can easily 
hack this application by modifying the user agent that you send to the server.")
    }
    windowsUserName = User.Identity.Name;
}

简而言之,即使上述方法有效,也不要这样做。您确实需要重新思考如何验证您的应用程序。

如果,正如您在问题的第一句中所指出的,这只是的信息,那么可能是可以的(例如,如果它只是用于调试目的)。然而,不适合,例如用于审核或限制对任何资源的访问,并且必须非常小心,以免在任何实际的安全上下文中重复使用此代码。

最新更新