ASP.NET MVC и проверка подлинности Windows с пользовательскими ролями - PullRequest
15 голосов
/ 18 мая 2011

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

<authentication mode="Windows" />

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

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

В моем интернет-приложении у меня была форма, где пользователь вводит данные.Форма отправляется на контроллер, который проверяет все и создает файл cookie с пользователем (и ролями) вошедшего в систему пользователя.

В моем global.asax я перехватил событие AuthenticateRequest, где я прочиталcookie и создать пользовательский принципал, который я использую во всем приложении для проверки прав доступа.

Как я могу реализовать это с помощью аутентификации Windows?

Ответы [ 2 ]

23 голосов
/ 18 мая 2011

Просто создайте нового участника и назначьте его пользователю и потоку в 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;
  }
}

Если у пользователя нет соответствующей роли, его можно запретить в приложении с помощью элемента authoirization web.config:

<authorization>
  <allow roles="blah,whatever"/>
  <deny users="*"/>               
</authorization>
6 голосов
/ 03 марта 2016

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

У меня есть сайт 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;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...