2011-08-21 45 views
13

這應該很簡單,但我完全不能在所有的Google搜索後找到它。這是我想要的。我有一個我想要授權的自定義用戶表(目前沒有角色)。爲此,我必須實現一個我已經完成的自定義成員資格提供程序。我的問題是,如何去設置一個自定義的IPrincipal到HttpContext.Current.User?應該在哪裏發生?比方說,我有以下設置:在ASP.NET MVC中使用窗體身份驗證的自定義IPrincipal

public class CustomMembershipProvider : MembershipProvider 
{ 
    private IUserRepository _repository; 

    public CustomMembershipProvider(IUserRepository repository) 
    { 
     _repository = repository; 
    } 

    public override bool ValidateUser(string username, string password) 
    { 
     //check user repository 
    } 

    //additional methods omitted for brevity 
} 

然後我有一個自定義用戶類的工具IPrincipalIIdentity

public class CustomUser : IPrincipal 
    { 
     public CustomUser(string name, int userId, string additionalInfo) 
     { 
      Identity = new CustomIdentity(name, userId, additionalInfo); 
     } 

     public IIdentity Identity { get; private set; } 

     public bool IsInRole(string role) 
     { 
      return true; 
     } 
    } 

    public class CustomIdentity : IIdentity 
    { 
     public CustomIdentity(string name, int userId, string additionalInfo) 
     { 
      Name = name; 
      UserId = userId; 
      AdditionalInfo = additionalInfo; 
     } 

     public string Name { get; private set; } 

     public string AuthenticationType 
     { 
      get { return "CustomAuth"; } 
     } 

     public bool IsAuthenticated 
     { 
      get { return !String.IsNullOrEmpty(Name); } 
     } 

     public int UserId { get; private set; } 
     public string AdditionalInfo { get; private set; } 
    } 

所以我的問題是,這裏是設置Context.User正確的位置到這個自定義用戶的實例?我需要一個自定義的授權屬性嗎?如果是這樣,那會是什麼樣子?

+0

最後你是如何得到這個的?我自己也在做類似的事情。 – ETFairfax

+0

我在同一條船上,幾乎已經準備好創建一個擴展方法來完成這項工作! –

回答

2

我建議使用自定義控制器基類所有的控制器

然後,在OnAuthorization,叫

protected override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext) 
{ 
    // Actual Authentication 
    HttpContext.User = user; 
    Thread.CurrentPrincipal = user; 
    base.OnAuthorization(filterContext); 
} 

我不完全知道如何調用成員資格提供,因爲我在做什麼它manuallt,但我認爲你有靜態訪問Membership.Provider執行實際的對象構造。

我需要一個自定義的授權屬性嗎?

號公告認證和授權的區別:建立認證用戶的身份在你的系統。授權允許或拒絕特定請求。因此,AuthorizeAttribute也有一個Roles參數,以允許某個操作僅由某些用戶調用。

+0

我不確定我瞭解你的答案。當你說實際身份驗證時,你是在談論實際設置AuthCookie嗎? Loing表單本身會在後期做什麼? – BFree

+0

我理解MembershipProvider的方式,不應該經常調用ValidateUser--只要用戶登錄,他就會調用一個認證cookie,這將在以後使用。但是,要獲得用戶對象,您必須打到數據庫(或某個緩存)。但這是你的代碼的一個要求。我認爲MembershipProvider設計得不是很好,手工做這件事有很多好處。 – mnemosyn

+0

現在,當我寫作我的時候,你改變了你的評論:)即使用戶已經(表單)認證,每個請求都會調用OnAuthorization;您只打數據庫來獲取用戶對象。 – mnemosyn