4

一部の保護されたページでフォーム認証を使用するサイト全体に基本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> 
+0

モジュールのソースを教えてください。 –

+0

@IanKemp、モジュールコードを私の質問に追加しました。それはログインとパスワードフォームweb.configのappSettingsを取ります – PanJanek

答えて

1

これは確かにカスタムモジュールで行うことができます。あなたは(そして私は他の理由で)ASP.NETのユーザーコンセプトを無視し、モジュールがログインを要求する401を返すようにしたり、必要に応じてリクエストを続行させたりすることができます。 RFC 2617にはそのことを知る必要があります。 ASP.NETのユーザーオブジェクトを無視すると、標準認証とアプリケーションで既に使用されているフォーム認証との間に干渉はありません。

HTTPS経由ではない場合、基本は簡単に傍受されることに注意してください。この場合、ダイジェストを代わりに使用することをお勧めします。ダイジェストは少し複雑ですが、確かに難しいことではありません。また、RFC 2617にも記載されています。

1

これは、あなたが探しているものが考えられます。

http://msdn.microsoft.com/en-us/library/aa479391.aspx#madam_topic4

とにかくそれだけで真偽を形成してログインし、使用してすべてのページをカバーするために、よりシンプルになります。

ロールを使用して匿名ユーザーを切断し、まだ登録されていないユーザーのロールを1つ作成し、登録ユーザーのロールを1つ作成することも考えられます。あなただけのあなたも、フォルダレベルで異なるルールを設定することができます最初の役割を無効にして、匿名ユーザーに

を有効にする最終段階では、これは、サイト全体のためにフォーム認証を使用して追加しないのはなぜ

0

を行くための別の方法です保護されたエリアとページのベータテスト担当者ですか?