Пользовательский принципал возвращается к GenericPrincipal при новых запросах - PullRequest
4 голосов
/ 03 февраля 2011

Я пытаюсь реализовать пользовательский принципал и пользовательскую идентификацию на веб-сайте .NET MVC.Я создал собственный основной класс, который наследуется от IPrincipal, и пользовательский идентификатор, который наследует от IIdentity.

Когда пользователь входит в систему, я устанавливаю и Thread.CurrentPrincipal, и HttpContext.Current.User в свой пользовательский принципал.Когда я просматриваю любой из отладчиков, значения устанавливаются со всеми свойствами.

Однако, как только запрос завершен, и я пытаюсь запросить любые другие страницы, Thread.CurrentPrincipal и HttpContext.Current.User имеют тип System.Security.Principal.GenericPrincipal, а не мой пользовательский принципал.

Нужно ли мне делать что-то "лишнее", чтобы вывести мой пользовательский принципал из потока или HttpContext?

Спасибо

Ответы [ 3 ]

6 голосов
/ 03 февраля 2011

Значения в Thread.CurrentPrincipal и HttpContext.Current.User не сохраняются между запросами, они перестраиваются при каждом запросе.Лучшее место для вас, вероятно, это Global.asax;напишите функцию с прототипом:

void Application_PostAuthenticateRequest(object sender, EventArgs e)

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

0 голосов
/ 21 апреля 2015

Я хотел бы немного расширить принятый ответ, надеюсь, я смогу сэкономить кому-то немного времени.

В моем случае основной принцип, который я использовал, содержал утверждения, заполненные результатами внешнегосервис, поэтому я хотел кешировать результаты во время входа в систему.

Я создал простой интерфейс кеширования IUserPrincipalCache и зарегистрировал его в MVC DependencyResolver.При входе в систему я создаю принципал и добавляю его в кеш.(Поскольку ваша реализация может отличаться, я все это опущу.)

Затем я реализовал это в Global.asax.cs:

protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
    if (User.Identity.IsAuthenticated)
    {
        var cache = DependencyResolver.Current.GetService<IUserPrincipalCache>();
        var claimsPrincipal = cache.FindUser(User.Identity.Name);
        if (claimsPrincipal != null)
        {
            Context.User = claimsPrincipal;
            Thread.CurrentPrincipal = claimsPrincipal;
        }
    }
}

Я думаю, что важно отметитьдля IsAuthenticated, поскольку во многих случаях я мог обойти проверку кэша.Вам также может не потребоваться обновить Thread.CurrentPrincipal, я думаю, это зависит от того, как вы его используете.

0 голосов
/ 22 октября 2013

Переопределение принципала в:

protected void Application_PostAuthenticateRequest(object sender, EventArgs e)

Вместо

protected void Application_AuthenticateRequest(object sender, EventArgs e)

В Global.asax.cs у меня работал в веб-приложении ASP

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...