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

时间:2014-04-17 09:57:33

标签: asp.net iis windows-authentication

我有一个不寻常的情况,其中认证是不必要的,但在某些情况下通过Windows身份验证学习用户ID会很有用。

为了给出一些上下文,我希望能够在用户代理匹配某些条件时要求Windows身份验证,但在其他条件下不需要身份验证。只有一些熟悉asp.net和iis我怀疑我错过了一个简单的方法来实现这一点。到目前为止,我已经考虑编写一个检查用户代理的模块,然后在满足条件时添加WindowsAuthenticationModule - 但我无法弄清楚如何执行此操作。

有关使用用户代理的值进行身份验证还是不进行身份验证的最佳方法的任何建议?

1 个答案:

答案 0 :(得分:0)

如果您设置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;
}

简而言之,即使上述情况有效,也不要。您确实需要完全重新考虑如何对应用程序进行身份验证。

如果你似乎在问题的第一句中指出这是纯粹的信息,那么可能可以(例如,如果它只是用于调试)目的)。但是,是合适的,例如审计或限制对任何资源的访问,您必须非常小心,不能在任何真正的安全上下文中重用此代码。