Почему Identity.IsAuthenticated () иногда true, иногда false

#asp.net #asp.net-mvc-3 #forms-authentication

#asp.net #asp.net-mvc-3 #формы-аутентификация

Вопрос:

У меня есть приложение MVC, которое использует службу аутентификации с методом IsAuthenticated (), который возвращает true / false.

Похоже, это не связано с проверкой подлинности FormsAuthentication.Метод SignOut () или когда я добавляю новый файл cookie авторизации при входе в систему.

Вход:

 HttpContext.Current.Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(authTicket))); 
  

Выход:

  FormsAuthentication.SignOut();
  

У меня есть пользовательский атрибут авторизации на моем контроллере, который вызывает службу аутентификации с помощью IsAuthenticated(), но он возвращает неправильное значение.

Кто-нибудь знает, почему следующий код иногда возвращает true или false?

 userPrincipal.Identity.IsAuthenticated
  

Ответ №1:

IsAuthenticated всегда возвращает false, если вы вызываете его с незащищенной страницы и установили requireSSL=»true» в web config, потому что не можете прочитать аутентифицированный файл cookie.

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

 Debug.Assert(HttpContext.Current.Request.IsSecureConnection, "oops, the IsAuthenticated is not working here");

if (HttpContext.Current.User.Identity.IsAuthenticated)
{

}
  

Комментарии:

1. Привет, у меня нет настройки SSL. IsAuthenticated возвращает false при вызове из службы в AuthorizeCore(), которая является моим пользовательским атрибутом авторизации.

2. @Jon тогда, возможно, не может прочитать файлы cookie и сеанс. Настроили ли вы службу для чтения файлов cookie записи и данных сеанса?

3. Я думаю, что я, возможно, понял проблему. Моя служба аутентификации зависит от IPrincipal, который вводится StructureMap во время запуска. Однако в этот момент он будет не прошел проверку подлинности. Мне нужно использовать IPrincipal вне текущего потока. Это передается в AuthorizeCore(), который вызывается в моем классе CustomAuthorise (наследуется от AuthorizeAttribute).

Ответ №2:

(Скопировано из комментария выше)

Моя служба аутентификации зависит от IPrincipal, который вводится StructureMap во время запуска. Однако в этот момент он будет не прошел проверку подлинности. Мне нужно использовать IPrincipal вне текущего потока. Это передается в AuthorizeCore(), который вызывается в моем классе CustomAuthorise (наследуется от AuthorizeAttribute)