Сохранять/назначать роли пользователей, прошедших проверку подлинности
Я обновляю сайт для использования MVC, и я ищу лучший способ настройки аутентификации.
В этот момент у меня есть вход в систему Active Directory: проверка имени пользователя и пароля, а затем настройка файла cookie Auth.
Как сохранить информацию о роли пользователя во время входа в систему, чтобы мои контроллеры могли видеть эти роли, когда пользователь перемещается по сайту?
[Authorize(Roles = "admin")]
У меня нет проблем с получением списка ролей из Active Directory. Я просто не знаю, где их поставить, чтобы контроллеры увидели их.
Ответы
Ответ 1
Когда вы аутентифицируете своего пользователя, вы создаете новый экземпляр GenericPrincipal. Конструктор принимает массив строк, которые являются ролями для пользователя. Теперь установите HttpContext.Current.User равным родовому главному и напишите auth cookie, и это должно сделать это.
Ответ 2
Роли добавляются в IPrincipal HttpContext. Вы можете создать GenericPrincipal, проанализировать список ролей в конструкторе и установить его как HttpContext.User. Затем GenericPrincipal будет доступен через атрибут User.IsInRole("role")
или [Authorize(Roles="role")]
Одним из способов сделать это (в С#) является добавление ваших ролей в виде строки, разделенной запятой, в параметре пользовательских данных при создании вашего билета аутентификации
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);
Затем перейдите в список ролей из билета проверки подлинности и создайте GenericPrincipal из вашего 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;
}
}
Ответ 3
Для тех из вас, кто использует MVC 4 или Greater, вам нужно будет посоветоваться с советом Ярослава Валишко при использовании ответа Дэвида Гленна:
"Я протестировал его в ASP.NET MVC 4, и я предлагаю вместо этого использовать Application_PostAuthenticateRequest. В противном случае общий принцип будет переопределен". - Ярослав Валишко 7 сентября в 16:18
Итак, как указано выше, все, что вам нужно сделать, это заменить имя метода Application_AuthenticateRequest с помощью Application_PostAuthenticateRequest, чтобы заставить это работать. Работал как прелесть для меня! Если бы мне было разрешено выдвигать Ярослава и Дэвида, я бы это сделал.
Ответ 4
Я был бы склонен к созданию настраиваемого поставщика роли. Пример здесь:
http://www.danharman.net/2011/06/23/asp-net-mvc-3-custom-membership-provider-with-repository-injection/
Ответ 5
Не могли бы вы зайти в менеджер роли хранилища авторизации или найти (например, на Codeplex) или написать другой поставщик ролей, который работает с Active Directory, чтобы получить информацию о группах?
Это избавит вас от необходимости проверять подлинность пользователя, получать его роли, а затем повторно передавать эту информацию в конструктор, и все это произойдет автоматически для вас как часть фреймворка.