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