2009-11-30 78 views
53

我正在升級站點以使用MVC,並且正在尋找設置身份驗證的最佳方式。存儲/分配經過身份驗證的用戶的角色

此時,我已登錄Active Directory:驗證用戶名和密碼,然後設置Auth cookie。

如何在登錄時存儲用戶的角色信息,以便我的控制器在用戶瀏覽網站時看到這些角色?

[Authorize(Roles = "admin")] 

我沒有問題從Active Directory獲取角色列表。我只是不知道把它們放在哪裏,以便控制器能看到它們。

回答

6

當您對用戶進行身份驗證時,您將生成一個新的GenericPrincipal實例。構造函數接受一組字符串,這些字符串是用戶的角色。現在將HttpContext.Current.User設置爲等於通用主體並寫入auth cookie,並且應該這樣做。

1

您是否可以不在authorization store role managerfind (e.g. on Codeplex)writewrite中放置另一個與Active Directory一起使用以獲取組信息的角色提供程序?

這將爲您節省認證用戶,獲取角色,然後將該信息重新傳遞給構造函數的麻煩,並且將作爲框架的一部分自動發佈給您。

121

將角色添加到HttpContext的IPrincipal。您可以創建一個GenericPrincipal,解析構造函數中的角色列表並將其設置爲HttpContext.User。隨後的GenericPrincipal將通過User.IsInRole("role")可以訪問或[Authorize(Roles="role")]屬性

這樣做(在C#)的一種方法是創建身份驗證票證時添加您的角色在用戶數據參數,以逗號分隔字符串

string roles = "Admin,Member"; 
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
    1, 
    userId, //user id 
    DateTime.Now, 
    DateTime.Now.AddMinutes(20), // expiry 
    false, //do not remember 
    roles, 
    "/"); 
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, 
            FormsAuthentication.Encrypt(authTicket)); 
Response.Cookies.Add(cookie); 

然後從身份驗證票證從你的Global.asax.cs

protected void Application_AuthenticateRequest(Object sender, EventArgs e) { 
    HttpCookie authCookie = 
       Context.Request.Cookies[FormsAuthentication.FormsCookieName]; 
    if (authCookie != null) { 
     FormsAuthenticationTicket authTicket = 
            FormsAuthentication.Decrypt(authCookie.Value); 
     string[] roles = authTicket.UserData.Split(new Char[] { ',' }); 
     GenericPrincipal userPrincipal = 
         new GenericPrincipal(new GenericIdentity(authTicket.Name),roles); 
     Context.User = userPrincipal; 
    } 
    } 
+1

如果克勞斯在你之前沒有回答,我會給你正確的答案。這是我做事情的確切方式。感謝您的詳細解答。對不起,這有點晚了。 – 2009-12-01 15:04:53

+0

我想這不適用于禁用Cookie的用戶? – Omu 2010-02-17 20:16:56

+1

@Omu您可以通過簡單地修改Application_AuthenticationRequest()方法來在Cookie中查找身份驗證票證(如果該Cookie不存在),以支持無Cookie身份驗證。重要的部分是角色存儲在加密的身份驗證票證中。 – 2010-02-17 22:27:45

4

對於那些使用MVC 4或更高版本,你需要利用戴維·格倫的回答時採取雅羅斯瓦夫Waliszko的建議是:

「我在ASP中進行了測試。 NET MVC 4,我建議使用Application_PostAuthenticateRequest,否則通用主體將被覆蓋。「 - Jaroslaw Waliszko 9月7日16:18

因此,如上所述,您只需將Application_AuthenticateRequest方法名替換爲Application_PAuthenticateRequest即可使其工作。像我的魅力一樣工作!如果我被允許對Jaroslaw和David進行升級,我會的。

+3

我試過了,但由於我是新註冊的成員,所以我無法發表評論,因此我的堆棧溢出聲譽不存在。如果這經過它會震驚和驚喜我:) *隊列休克和驚喜* – Gareth 2014-01-06 05:52:11

相關問題