【问题标题】:Basic authentication IHttpModule unexpected behaviour基本身份验证 IHttpModule 意外行为
【发布时间】:2012-11-13 19:12:19
【问题描述】:

我在 IIS7 中为我的站点启用了基本身份验证,并按照 link 为基本身份验证请求创建处理程序。 问题是,无论用户输入什么凭据,即使输入了正确的凭据,站点也会不断返回 401。这只是一个测试,凭据会根据硬编码值进行检查。

相关代码如下:

  public class BasicAuthenticationHttpModule : IHttpModule 
{
    public void Init(HttpApplication context)
    {
        context.BeginRequest+=context_BeginRequest;
        context.AuthenticateRequest += context_AuthenticateRequest;
    }

    void context_AuthenticateRequest(object sender, EventArgs e)
    {
        HttpApplication application = (HttpApplication)sender;

        TryAuthenticate(application);
    }

    private void context_BeginRequest(object sender, EventArgs e)
    {
        HttpApplication application = (HttpApplication)sender;

        TryAuthenticate(application);
    }

    private static void TryAuthenticate(HttpApplication application)
    {
        if (!Authenticate(application.Context))
        {
            application.Context.Response.Status = "401 Unauthorized";
            application.Context.Response.StatusCode = 401;
            application.Context.Response.AddHeader("WWW-Authenticate", "Basic");
            application.CompleteRequest();
        }
    }

    private static bool Authenticate(HttpContext context)
    {            
        if (context.User!=null && context.User.Identity.IsAuthenticated)
        {
            return true;
        }

        if (!context.Request.Headers.AllKeys.Contains("Authorization"))
            return false;

        string authHeader = HttpContext.Current.Request.Headers["Authorization"];

        IPrincipal principal;
        if (TryGetPrincipal(authHeader, out principal))
        {
            context.User = principal; 
            return true;
        }
        return false;
    }

    private static bool TryGetPrincipal(string[] creds, out IPrincipal principal)
    {
        if (creds[0] == "Administrator" && creds[1] == "SecurePassword")
        {
            principal = new GenericPrincipal(
               new GenericIdentity("Administrator"),
               new string[] { "Administrator", "User" }
            );
            return true;
        }
        if (creds[0] == "BasicUser" && creds[1] == "Password")
        { 
            principal = new GenericPrincipal(
               new GenericIdentity("BasicUser"),
               new string[] { "User", "SystemUser" }
            );
            return true;
        }
        else
        {
            principal = null;
            return false;
        }
    }

当客户端输入正确的凭据(即“BasicUser”、“Password”)时,会创建 GenericPrincipal 对象并将其分配给 HttpContext 的 User 属性。查看 Request.IsAuthenticated 告诉它是true

这就是为什么我不明白为什么客户一次又一次地收到 401。
我不确定所有管道是如何工作的 - 可能是基本身份验证更进一步到一些也服务于请求的 IIS HttpModule?或者可能是代码不完整,context_BeginRequest 需要扩展? (我知道在 Forms 身份验证类型的情况下,您会执行 Response.Redirect(goodguy.aspx) 之类的操作)

无论如何,感谢任何帮助/问题。

忘了说在web.config中我也放了

<system.webServer>
    <modules>
      <add name="BasicAuthenticationHttpModule" type="Analytics.BasicAuthenticationHttpModule" />
    </modules>
  </system.webServer>

【问题讨论】:

    标签: asp.net basic-authentication


    【解决方案1】:

    显然实现了它自己的基本身份验证。因此我们的模块可以成功地验证请求,它会被传递给内置的 IIS 模块,该模块拒绝验证。不复制粘贴真的很有帮助,但也确实要自己思考。所以回答我的问题 - 禁用 IIS 上的所有身份验证,匿名除外。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-12
      • 2017-09-18
      • 2017-06-13
      • 2013-05-30
      • 2021-06-20
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多