ASP.NET MVC и проверка подлинности Windows с помощью настраиваемых ролей

Я пытаюсь реализовать проверку подлинности Windows в своем приложении ASP.NET MVC2. Я выполнил все шаги, предложенные официальной документацией:

<authentication mode="Windows" />

<authorization>
  <deny users="?" />
</authorization>

Я указал аутентификацию NTLM. Все идет нормально. Все работает нормально. Я хотел бы проверить, что пользователи вошли в мою базу данных. Я хотел бы получить роли из моей таблицы, а затем управлять авторизацией с помощью настраиваемого атрибута.
Я не хочу использовать поставщик членства и ролей. У меня уже есть мои таблицы "Пользователи/Роли", потому что они были использованы для интернет-приложения (это приложение Intranet).

В моем приложении для Интернета у меня была форма, в которой пользователь вводит данные. Форма отправляется контроллеру, который проверяет все и создает 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;
  }
}

Если пользователь не имеет какой-либо роли, он может быть запрещен с помощью элемента authirzation web.config:

<authorization>
  <allow roles="blah,whatever"/>
  <deny users="*"/>               
</authorization>

Ответ 2

Просто чтобы добавить к вышеуказанному ответу, Надеюсь, что это немного сэкономит некоторое время.

У меня есть сайт MVC 5 интрасети с VS 2015.

Код не работал у меня, пока верхняя строка не была обновлена ​​с помощью HttpContext.Current.User. Сайт давал мне нулевую ссылку на HttpContext.Current.User, если пользователь еще не был создан в базе данных. Добавив .User в первую строку, он обошел этот код при первой загрузке и работал.

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