Вы захотите создать метод в Global.asax.cs со следующей подписью
protected void Application_PostAuthenticateRequest()
{
//Your code here.
}
Это будет вызвано автоматически, прежде чем будет выполнено почти что-либо еще (MVC вызовет этот метод, если он существует, вам не нужно «включать его» где-либо), и именно здесь вам нужно установить Принципал. Например, давайте предположим, что у вас есть заголовок с именем RolesHeader
, в котором значение ролей разделено запятыми, и другой заголовок с именем UserId
, в котором (duh) указан идентификатор пользователя.
Ваш код без обработки ошибок может выглядеть примерно так:
protected void Application_PostAuthenticateRequest()
{
var rolesheader = Context.Request.Headers["RolesHeader"];
var userId = Context.Request.Headers["UserId"];
var roles = rolesheader.Split(',');
var principal = new GenericPrincipal(new GenericIdentity(userId), roles);
Context.User = principal;
}
Это Принцип / Удостоверение, которое использует атрибут [Authorize]
, поэтому его установка здесь в начале жизненного цикла запроса означает, что атрибут [Authorize]
будет работать правильно.
Остальное необязательно, но я рекомендую:
Мне нравится создавать свои собственные пользовательские классы, которые реализуют IPrincipal и IIdentity, а не используют GenericPrincipal и GenericIdentity, чтобы в них можно было добавлять больше пользовательской информации. Мои пользовательские объекты «Принципал» и «Идентичность» содержат гораздо более подробную информацию, такую как номера филиалов, адреса электронной почты и т. Д.
Затем я создаю контроллер с именем BaseController
, который имеет следующий
protected new CustomPrincipal User
{
get
{
return (base.User as CustomPrincipal) ?? CustomPrincipal.GetUnauthorizedPrincipal();
}
}
Это позволяет мне получить доступ ко всем моим богатым, пользовательским данным Принципала, а не только к тому, что определено в IPrincipal. Все мои настоящие контроллеры наследуются от BaseController
, а не от Controller
.
Очевидно, что при использовании подобного Принципала, подобного этому, в методе Application_PostAuthenticateRequest () вы устанавливаете Context.User как CustomPrincipal
вместо GenericPrincipal
.