一部の保護されたページでフォーム認証を使用するサイト全体に基本HTTP認証を追加したいと考えています。このアイデアは、ポータルの開発段階をクライアントに提示することで、彼はそれに取り組むことができますが、他の誰もアクセスできないようにHTTPレベルで簡単なログインとパスワードを追加してサイト全体を保護します。 ポータルでフォーム認証(ユーザー登録あり)を機能の一部として使用できるため、web.configのクラシックタグでは十分ではありません。 後で起こる可能性のあるフォーム認証の前に、HTTPでユーザーを認証したいと考えています。.netアプリケーションで基本HTTP認証とフォーム認証を併用する方法
HTTPレベルの承認には、管理者が設定したログインとパスワード(テキストファイル)が必要です。
この機能をカスタムhttpモジュールで実現することは可能でしょうか?
UPDATE:
アイデアは、アプリケーションを確保する構成レベルの方法を作成することです。異なるアカウントの種類や役割を扱うにはアプリケーションの変更が必要になるため、フォーム認証はここでは選択できません。
私はすでにのWeb.Configを経由して任意のウェブサイトに取り付けることができるHTTPのAuthorizationヘッダとHTTP 401このモジュールとの応答をテストする簡単なカスタムモジュールと、この問題を解決した
SOLUTION:
Moduleクラス:web.configファイルで
public class BasicAuthModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(this.HttpApplicationBeginRequest);
}
private void HttpApplicationBeginRequest(object sender, EventArgs e)
{
var request = HttpContext.Current.Request;
var response = HttpContext.Current.Response;
string authHeader = request.Headers["Authorization"];
if (string.IsNullOrEmpty(authHeader))
{
this.RequireAuthorization(response);
}
else
{
string authType = authHeader.Split(' ').First();
string authData = authHeader.Split(' ').Last();
if (authType.ToLower() == "basic")
{
byte[] bytes = Convert.FromBase64String(authData);
string plainText = Encoding.UTF8.GetString(bytes);
string login = plainText.Split(':').First();
string password = plainText.Split(':').Last();
if (!this.Validate(login, password))
{
this.DenyAccess(response);
}
}
else
{
this.DenyAccess(response);
}
}
}
private bool Validate(string login, string password)
{
return (login == ConfigurationManager.AppSettings["AuthLogin"]) && (password == ConfigurationManager.AppSettings["AuthPwd"]);
}
private void RequireAuthorization(HttpResponse response)
{
response.AddHeader("WWW-Authenticate", "Basic realm=\"stage\"");
response.StatusCode = 401;
response.Status = "401 Authorization Required";
response.ContentType = "text/html";
response.End();
}
private void DenyAccess(HttpResponse response)
{
response.AddHeader("WWW-Authenticate", "Basic realm=\"stage\"")
response.StatusCode = 401;
response.Status = "401 Authorization Required";
response.ContentType = "text/html";
response.End();
}
}
:
<modules runAllManagedModulesForAllRequests="true">
...
<add name="BasicAuthModule" type="MyNamespace.BasicAuthModule, MyNamespace.Module"/>
</modules>
モジュールのソースを教えてください。 –
@IanKemp、モジュールコードを私の質問に追加しました。それはログインとパスワードフォームweb.configのappSettingsを取ります – PanJanek