ASP.NET Проверка подлинности MVC и Windows с пользовательскими ролями

#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;
        }