Как я могу зарегистрировать пользовательский тип Принципал в ASP.NET MVC 5? - PullRequest
2 голосов
/ 12 октября 2019

У меня есть приложение, написанное с использованием C # поверх платформы ASP.NET MVC 5.

Вместо использования встроенной ClaimsPrincipal реализации интерфейса IPrincipal, я хочук используемой MyOwnClaimsPrincipal реализации. Мой класс MyOwnClaimsPrincipal реализует интерфейс IPrincipal.

Другими словами, я хочу иметь возможность доступа к экземпляру MyOwnClaimsPrincipal из класса AuthorizeAttribute или как свойство User в контроллереи виды.

вот пример того, что я хочу иметь возможность сделать

public class TestAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        // This does not work
        MyOwnClaimsPrincipal user1 = filterContext.HttpContext.User as MyOwnClaimsPrincipal;

        // Yet, this works which tells me that my mplementation is not being used
        ClaimsPrincipal user2 = filterContext.HttpContext.User as ClaimsPrincipal;

    }
}

Я пытался использовать метод Application_BeginRequest в Global.asax.cs для установки Thread.CurrentPrincipal и HttpContext.Current.User в начале каждого запроса примерно так:

public void Application_BeginRequest()
{
    var user = new MyOwnClaimsPrincipal();//...

    Thread.CurrentPrincipal = user;
    HttpContext.Current.User = user;
} 

К сожалению, это не сработало. filterContext.HttpContext.User по-прежнему установлен на ClaimsPrincipal, и когда я приводил его как MyOwnClaimsPrincipal, возвращается ноль.

Как правильно настроить единственную реализацию IPrincipal, которая будет использоваться в приложении

1 Ответ

1 голос
/ 12 октября 2019

Я думаю, что вы опоздали в соответствии с этой статьей Application_BeginRequest - первое событие.

Просто угадать: кажетсямеханизм аутентификации по умолчанию не проверяет, назначен ли уже IPrincipal, поэтому он переопределяет ваш.

Я сделал то же самое с помощью обработчика Application_PostAuthenticateRequest, и он отлично работает:

protected void Application_PostAuthenticateRequest(object sender, EventArgs eventArgs)
{
    var claims = new List<Claim>();
    claims.Add(new Claim(ClaimTypes.NameIdentifier, "42");
    claims.Add(new Claim(ClaimTypes.Name, "Hello World"));
    var claimsIdentity = new ClaimsIdentity(claims, "MylAuthentificationSheme");
    Context.User = new ClaimsPrincipal(claimsIdentity);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...