2016-08-03 10 views
1

.NETメンバーシップ経由でユーザーを認証する既存のASP.NET MVC 4.5アプリケーションがあります。また、ブラウザを使用してログインできないDevOpsタイプのスクリプト(キャッシュのウォーミング、テストなど)で使用するために、メンバーシップの代わりにオプションの基本的なHTTP認証を許可したいと思います。ASP.NETメンバーシップの認証とHTTP認証をMVCアプリケーションで結合する

理想的には、HTTP認証に使用される資格情報はメンバーシップと同じですが、重要ではありません。唯一の重要なことは、Webサイトユーザーは、HTTP資格情報が提供されていない場合、その資格情報の入力を求められないということです。

答えて

1

一つの方法は、AuthorizeAttributeOnAuthorizeメソッドをオーバーライドAuthorizationヘッダーが存在するかどうかを確認し、あなたがそれを見つけた場合、資格情報を抽出し、検証した後、手でIPrincipalを作成することです。それ以外の場合は、base.OnAuthorizationに電話して、通常の.NETメンバーシップの処理が行われるようにします。

ソース:

public class RoleAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     bool basicValidated = false; 
     var req = filterContext.HttpContext.Request; 
     var auth = req.Headers["Authorization"]; 
     if (!string.IsNullOrEmpty(auth)) 
     { 
      var cred = System.Text.Encoding.ASCII.GetString(Convert.FromBase64String(auth.Substring(6))).Split(':'); 
      var userName = cred[0]; 
      var pass = cred[1]; 
      var membership = new AccountMembershipService(); 
      basicValidated = membership.ValidateUser(userName, pass); 
      if (!basicValidated) 
      { 
       base.OnAuthorization(filterContext); 
      } 
      else 
      { 
       var roles = System.Web.Security.Roles.GetRolesForUser(userName); 
       IPrincipal principal = new GenericPrincipal(
        new GenericIdentity(userName),roles); 
       Thread.CurrentPrincipal = principal; 
       System.Web.HttpContext.Current.User = principal; 
      } 
     } else 
     { 
      base.OnAuthorization(filterContext); 
     } 


    } 
} 
+1

私はあなたがOnAuthorize方法でプリンシパルにHttpContext.Current.Userを設定することをお勧めします驚いています。確かに、これは、認証されていないユーザーがアクセスでき、Authorize属性を持たないコントローラ/アクションが、認証された場合、現在のユーザーにアクセスできないことを意味します。従来のASP.NETでは、HttpContext.Current.Userを設定する場所はApplication_PostAuthenticateRequestにありますが、MVCでは同じではないでしょうか? – Joe

+0

良い点は、そこに置く方が良いかもしれない。私はそれについて考え、私の答えを修正するでしょう。 – jackmott

関連する問題