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