0

サイトの IIS7 で基本認証を有効にし、このリンクに従って基本認証要求のハンドラーを作成しました。問題は、ユーザーがどの資格情報を入力しても、正しい資格情報を入力してもサイトが 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拡張する必要があるのでしょうか? (フォーム認証タイプの場合、Response.Redirect(goodguy.aspx)のようなことをすることは知っています)

とにかく、ヘルプ/質問は大歓迎です。

web.configにも配置したことを忘れていました

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

1 に答える 1

0

どうやらそれ自身の基本認証を実装しています。したがって、モジュールは要求を正常に認証でき、組み込みのIISモジュールに渡され、認証が拒否されます。コピー&ペーストするのではなく、自分自身を実際に考えることも非常に役立ちます。だから私の質問に答えるために-匿名を除くIISのすべての認証を無効にします。

于 2012-11-13T20:34:57.757 に答える