Кто устанавливает свойство IsAuthenticated в HttpContext.User.Identity - PullRequest
22 голосов
/ 28 декабря 2011

Этот код взят из исходного кода asp.net mvc RTM

Кто устанавливает свойство IsAuthenticated HttpContext.User.Identity?

   protected virtual bool AuthorizeCore(HttpContextBase httpContext) {
        if (httpContext == null) {
            throw new ArgumentNullException("httpContext");
        }

        IPrincipal user = httpContext.User;
        if (!user.Identity.IsAuthenticated) {
            return false;
        }
    }

Является ли свойство IsAuthenticated установленным путем вызова метода (пример проекта asp.net mvc 4.0):

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

Когда я отлаживаю код метода LogOn примера проекта asp.net mvc 4.0 после вышеуказанного вызова метода FormsAuth .... Исполнение

User.Identity.IsAuthenticated

все еще возвращает FALSE. Только когда я отлаживаю LogOff метод

User.Identity.IsAuthenticated

говорит ИСТИНА. Так кто же устанавливает это свойство в TRUE и WHEN?

UPDATE

Это примерно ФОРМЫ аутентификация!

Теперь я отладил метод LogOn примера проекта asp.net mvc, и после того, как было возвращено действие LogOn, вызывается мой метод AuthorizeCore, который я переопределил, а затем свойство IsAuthenticated имеет значение TRUE!

Может ли значение TRUE зависеть от коллекций ModelState.Value.Error?

Если count == 0 в коллекциях ошибок, IsAuthenticated имеет значение TRUE иначе IsAuthenticated - ЛОЖЬ

Вы можете это подтвердить?

Ответы [ 2 ]

24 голосов
/ 29 декабря 2011

Это свойство устанавливается модулем проверки подлинности форм путем чтения и анализа файла cookie проверки подлинности форм из запроса .Я выделил запрос жирным шрифтом, потому что подозреваю, что именно поэтому вы наблюдаете такое поведение.Позволь мне объяснить.Когда вы вызываете FormsAuthentication.SetAuthCookie после успешной аутентификации, вы добавляете куки аутентификации в ответ .Этот файл cookie будет сохранен в браузере клиента и будет отправлен на последующих запросов.Таким образом, только при последующих запросах пользователь будет считаться аутентифицированным.Поэтому вам нужно всегда перенаправлять после вызова метода SetAuthCookie.Внутри запроса, вызвавшего этот метод, вы уже знаете, предоставили ли пользователь правильные учетные данные, поэтому вам не нужно проверять свойство IsAuthenticated.

1 голос
/ 29 декабря 2011

Происхождение свойства зависит от типа Identity. Для FormsIdentity свойство просто возвращает true:

/// <devdoc>
///    Indicates whether or not authentication took
///    place.
/// </devdoc> 
public  bool                         IsAuthenticated { get { return true;}}

Это имеет смысл, потому что код в FormsAuthenticationModule.cs назначает FormsIdentity только после аутентификации. Код кажется довольно сложным, я вижу, что он извлекает билет из куки, но я не могу найти, где он проверяет билет.

...