Сохранять / назначать роли пользователей, прошедших проверку подлинности

Я обновляю сайт для использования MVC, и я ищу лучший способ настройки аутентификации.

На этом этапе у меня есть вход в систему Active Directory: проверка имени пользователя и пароля, а затем настройка файла cookie Auth.

Как сохранить информацию о роли пользователя во время входа в систему, чтобы мои controllerы могли видеть эти роли, когда пользователь перемещается по сайту?

[Authorize(Roles = "admin")] 

У меня нет проблем с получением списка ролей из Active Directory. Я просто не знаю, где их поставить, чтобы контролеры увидели их.

Когда вы аутентифицируете своего пользователя, вы создаете новый экземпляр GenericPrincipal. Конструктор принимает массив строк, которые являются ролями для пользователя. Теперь установите HttpContext.Current.User равным родовому главному и напишите auth cookie, и это должно сделать это.

Роли добавляются в IPrincipal 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, чтобы заставить это работать. Работал как прелесть для меня! Если бы мне позволили выдвигать Ярослава и Давида, я бы это сделал.

Я был бы склонен просто создавать пользовательский поставщик роли. Пример:

http://www.danharman.net/2011/06/23/asp-net-mvc-3-custom-membership-provider-with-repository-injection/

Не могли бы вы зайти в диспетчер ролей хранилища авторизации или найти (например, на Codeplex) или написать другой поставщик ролей, который работает с Active Directory, чтобы получить информацию о группах?

Это избавит вас от необходимости проверять подлинность пользователя, получать их роли, а затем повторно передавать эту информацию в конструктор, и все это произойдет автоматически для вас как части фреймворка.

Interesting Posts
Давайте будем гением компьютера.