Хранить / назначать роли аутентифицированных пользователей
Я обновляю сайт, чтобы использовать MVC, и я ищу лучший способ настроить аутентификацию.
На данный момент у меня работает вход в Active Directory: проверка имени пользователя и пароля, а затем установка cookie-файла Auth.
Как мне сохранить информацию о роли пользователя во время входа в систему, чтобы мои контролеры могли видеть эти роли, когда пользователь перемещается по сайту?
[Authorize(Roles = "admin")]
У меня нет проблем с получением списка ролей из Active Directory. Я просто не знаю, где их разместить, чтобы контролеры их увидели.
5 ответов
Когда вы аутентифицируете своего пользователя, вы генерируете новый экземпляр GenericPrincipal. Конструктор принимает массив строк, которые являются ролями для пользователя. Теперь установите HttpContext.Current.User равным универсальному принципалу и запишите файл cookie аутентификации, и это должно сделать это.
Роли добавляются в IP -принцип HttpContext. Вы можете создать 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);
Затем получите доступ к списку ролей из билета аутентификации и создайте 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;
}
}
Для тех из вас, кто использует MVC 4 или Greater, вам понадобится совет Ярослава Валишко при использовании ответа Дэвида Гленна:
"Я протестировал его в ASP.NET MVC 4 и предлагаю вместо этого использовать Application_PostAuthenticateRequest. В противном случае общий принципал будет переопределен". - Ярослав Валишко 7 сентября в 16:18
Итак, как указано выше, все, что вам нужно сделать, это заменить имя метода Application_AuthenticateRequest на Application_PostAuthenticateRequest, чтобы заставить это работать. Работал как шарм для меня! Если бы мне разрешили проголосовать Ярославу и Давиду, я бы это сделал.
Я был бы склонен просто создать собственный поставщик ролей. Пример здесь:
Не могли бы вы не добавить ни менеджера ролей хранилища авторизации, ни найти (например, в Codeplex) или написать другого поставщика ролей, который работает с Active Directory для получения информации о группах?
Это избавит вас от необходимости проверять подлинность пользователей, получать их роли и затем повторно передавать эту информацию в конструктор, и все это будет происходить автоматически для вас как части фреймворка.