Подтвердить что ты не робот

Как проверить, аутентифицирован ли пользователь в MVC5?

Я видел следующие два доступных логических элемента:

  • System.Web.Mvc.Controller.User.Identity.IsAuthenticated
  • System.Web.Mvc.Controller.Request.IsAuthenticated

Есть ли разница между ними. Они оба, похоже, делают то же самое, поэтому я не уверен, что использовать.

Что я хотел бы сделать:

@if (User.Identity.IsAuthenticated) {
  if (User.IsInRole("Admin")) {
    @Html.ActionLink("Admin", "AdminController")        
  }
}

или

@if (Request.IsAuthenticated) {
  if (User.IsInRole("Admin")) {
    @Html.ActionLink("Admin", "AdminController")        
  }
}

Хорошо ли было бы выполнено одно из этих действий?

4b9b3361

Ответ 1

Нет никакой разницы. Единственное различие заключается в том, что если пользователь не аутентифицирован, User.Identity может быть нулевым, и, таким образом, вы можете получить NRE, тогда как при втором подходе внутри есть проверка на это и безопаснее.

Здесь как реализуется метод Request.IsAuthenticated:

public bool IsAuthenticated
{
    get
    {
        return this._context.User != null && 
               this._context.User.Identity != null &&
               this._context.User.Identity.IsAuthenticated;
    }
}

В основном это немного безопаснее первого.

Ответ 2

Свойство IsAuthenticated, чтобы определить, прошел ли текущий запрос. Если он не был аутентифицирован, запрос перенаправляется на другую страницу, где пользователи могут вводить свои учетные данные в веб-приложение. Это общий метод, используемый на странице по умолчанию для приложения.

, но когда дело доходит до User.Identity.IsAuthenticated

Свойство User предоставляет программный доступ к свойствам и методам интерфейса IPrincipal. Поскольку страницы ASP.NET содержат ссылку по умолчанию для пространства имен System.Web(которое содержит класс HttpContext), вы можете ссылаться на элементы HttpContext на странице .aspx, не используя полностью квалифицированную ссылку на класс для HttpContext. Например, вы можете использовать User.Identity.Name, чтобы получить имя пользователя, от имени которого работает текущий процесс. Однако, если вы хотите использовать членов IPrincipal из модуля кода с кодом ASP.NET, вы должны включить ссылку на пространство имен System.Web в модуле и полностью квалифицированную ссылку как на текущий активный контекст запроса/ответа, так и на класс в System.Web, который вы хотите использовать. Например, на странице, содержащей код, вы должны указать полное имя