我正在升級站點以使用MVC,並且正在尋找設置身份驗證的最佳方式。存儲/分配經過身份驗證的用戶的角色
此時,我已登錄Active Directory:驗證用戶名和密碼,然後設置Auth cookie。
如何在登錄時存儲用戶的角色信息,以便我的控制器在用戶瀏覽網站時看到這些角色?
[Authorize(Roles = "admin")]
我沒有問題從Active Directory獲取角色列表。我只是不知道把它們放在哪裏,以便控制器能看到它們。
我正在升級站點以使用MVC,並且正在尋找設置身份驗證的最佳方式。存儲/分配經過身份驗證的用戶的角色
此時,我已登錄Active Directory:驗證用戶名和密碼,然後設置Auth cookie。
如何在登錄時存儲用戶的角色信息,以便我的控制器在用戶瀏覽網站時看到這些角色?
[Authorize(Roles = "admin")]
我沒有問題從Active Directory獲取角色列表。我只是不知道把它們放在哪裏,以便控制器能看到它們。
當您對用戶進行身份驗證時,您將生成一個新的GenericPrincipal實例。構造函數接受一組字符串,這些字符串是用戶的角色。現在將HttpContext.Current.User設置爲等於通用主體並寫入auth cookie,並且應該這樣做。
您是否可以不在authorization store role manager或find (e.g. on Codeplex)或write或write中放置另一個與Active Directory一起使用以獲取組信息的角色提供程序?
這將爲您節省認證用戶,獲取角色,然後將該信息重新傳遞給構造函數的麻煩,並且將作爲框架的一部分自動發佈給您。
將角色添加到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;
}
}
我傾向於只創建一個自定義的角色提供訪問的角色列表和創建的GenericPrincipal。這裏的例子:
對於那些使用MVC 4或更高版本,你需要利用戴維·格倫的回答時採取雅羅斯瓦夫Waliszko的建議是:
「我在ASP中進行了測試。 NET MVC 4,我建議使用Application_PostAuthenticateRequest,否則通用主體將被覆蓋。「 - Jaroslaw Waliszko 9月7日16:18
因此,如上所述,您只需將Application_AuthenticateRequest方法名替換爲Application_PAuthenticateRequest即可使其工作。像我的魅力一樣工作!如果我被允許對Jaroslaw和David進行升級,我會的。
我試過了,但由於我是新註冊的成員,所以我無法發表評論,因此我的堆棧溢出聲譽不存在。如果這經過它會震驚和驚喜我:) *隊列休克和驚喜* – Gareth 2014-01-06 05:52:11
如果克勞斯在你之前沒有回答,我會給你正確的答案。這是我做事情的確切方式。感謝您的詳細解答。對不起,這有點晚了。 – 2009-12-01 15:04:53
我想這不適用于禁用Cookie的用戶? – Omu 2010-02-17 20:16:56
@Omu您可以通過簡單地修改Application_AuthenticationRequest()方法來在Cookie中查找身份驗證票證(如果該Cookie不存在),以支持無Cookie身份驗證。重要的部分是角色存儲在加密的身份驗證票證中。 – 2010-02-17 22:27:45