サイトの 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>