2016-08-03 112 views
1

我有一個現有的ASP.NET MVC 4.5應用程序,它通過.NET Membership驗證用戶。我還希望允許使用可選的基本HTTP身份驗證代替成員資格,以供無法通過瀏覽器登錄的DevOps類型腳本(緩存預熱,測試等)使用。在MVC應用程序中結合ASP.NET成員身份驗證和HTTP驗證

理想情況下,用於HTTP認證的憑證與成員資格中的憑證相同,但並不重要。唯一關鍵的問題是,如果沒有提供HTTP憑據,網站用戶將不會提示。

回答

1

一種方法是覆蓋AuthorizeAttributeOnAuthorize方法,檢查是否存在授權標頭,如果找到它,請提取並驗證憑據,然後手動創建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

我很驚訝你推薦設置HttpContext.Current.User在OnAuthorize方法的主體。當然,這意味着未經身份驗證的用戶可訪問並且沒有Authorize屬性的Controllers/Actions如果碰巧經過身份驗證,將無法訪問當前用戶。在經典的ASP.NET中,設置HttpContext.Current.User的地方應該在Application_PostAuthenticateRequest中 - 對MVC來說不會是一樣的嗎? – Joe

+0

好點,可能會更好地把它放在那裏。我會考慮並修改我的答案。 – jackmott

相關問題