Asp.net

儲存/分配經過身份驗證的使用者的角色

  • November 30, 2009

我正在升級站點以使用 MVC,並且正在尋找設置身份驗證的最佳方法。

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

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

[Authorize(Roles = "admin")]

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

當您驗證您的使用者時,您會生成一個新的 GenericPrincipal 實例。建構子接受一個字元串數組,這些字元串是使用者的角色。現在設置 HttpContext.Current.User 等於通用主體並寫入 auth cookie,這應該可以。

角色被添加到 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 創建一個 GenericPrincipal

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;
   }
 }

引用自:https://stackoverflow.com/questions/1822548