#asp.net #asp.net-mvc #windows-authentication
#asp.net #asp.net-mvc #windows-проверка подлинности
Вопрос:
Я пытаюсь реализовать проверку подлинности Windows в моем ASP.NET Приложение MVC2. Я выполнил все шаги, предложенные в официальной документации:
<authentication mode="Windows" />
<authorization>
<deny users="?" />
</authorization>
Я указал проверку подлинности NTLM. Пока все хорошо. Все работает нормально.
Я хотел бы проверить пользователей, вошедших в систему, по моей базе данных.
Я хотел бы извлекать роли из своей таблицы, а затем управлять авторизацией с помощью пользовательского атрибута.
Я не хочу использовать поставщика членства и ролей.У меня уже есть мои таблицы пользователей / ролей, потому что они использовались для интернет-приложения (это приложение для интрасети).
В моем интернет-приложении у меня была форма, в которую пользователь вводит данные. Форма отправляется на контроллер, который все проверяет и создает файл cookie с пользователем (и ролями) вошедшего в систему пользователя.
В моем global.asax я заблокировал событие AuthenticateRequest, где я считываю cookie и создаю пользовательского участника, которого я использую во всем приложении для проверки авторизации.
Как я могу реализовать это с помощью проверки подлинности Windows?
Ответ №1:
Просто создайте нового участника и назначьте его пользователю и потоку в Global.asax (или используйте фильтр действий).
protected void Application_AuthenticateRequest(object sender, EventArgs args)
{
if(HttpContext.Current != null)
{
String [] roles = GetRolesFromSomeDataTable(HttpContext.Current.User.Identity.Name);
GenericPrincipal principal = new GenericPrincipal(HttpContext.Current.User.Identity, roles);
Thread.CurrentPrincipal = HttpContext.Current.User = principal;
}
}
Если у пользователя нет подходящей роли, ему можно запретить доступ к приложению с помощью элемента авторизации web.config:
<authorization>
<allow roles="blah,whatever"/>
<deny users="*"/>
</authorization>
Комментарии:
1. @Xhalent: Да, но … где …?
2. Измените элемент авторизации web config, чтобы ограничить пользователей определенными ролями. Я приведу пример в сообщении.
3. Потому что центры сертификации (безопасность доступа к коду) работают против участника потока, который не синхронизируется, если вы обновляете только HttpContext.User. Это означает, что декларативные атрибуты, такие как PrincipalPermission и т.д., Не будут оцениваться в соответствии с вашим предполагаемым принципалом. Лучше всего обновлять обе сразу.
4. Извините, и это может быть глупый вопрос… Но не будет ли это запрашивать базу данных и перестраивать принципала при каждом запросе с аутентификацией? Или я неправильно понимаю, как запускается Application_AuthenticateRequest…
5. Да, это вызывается при каждом запросе авторизации. Это также создает нового участника каждый раз для текущего потока. Некоторые для этой цели используют проверку подлинности Windows и Forms (cookie).
Ответ №2:
Просто чтобы добавить к приведенному выше ответу, надеюсь, это сэкономит некоторое время.
У меня есть сайт MVC 5 в интрасети с версией VS 2015.
Код не работал у меня, пока верхняя строка не была обновлена с помощью HttpContext.Current.User. Сайт выдавал мне нулевую ссылку на HttpContext.Current.Пользователь, если пользователь еще не был создан в базе данных. Путем добавления .Пользователь в первой строке, он обошел этот код при первой загрузке и сработал.
if (HttpContext.Current.User != null)
{
String[] roles = GetRolesFromSomeDataTable(HttpContext.Current.User.Identity.Name);
GenericPrincipal principal = new GenericPrincipal(HttpContext.Current.User.Identity, roles);
Thread.CurrentPrincipal = HttpContext.Current.User = principal;
}