Как я должен проверить, аутентифицирован ли пользователь в 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")        
  }
}

Будет ли любой из вышеперечисленных работать одинаково хорошо?

2 ответа

Решение

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

Вот как Request.IsAuthenticated Метод реализован:

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

В принципе, это немного безопаснее, чем первый.

Основываясь на ответе Дарина Димитрова, вы можете сократить код и использовать на месте:

if( User?.Identity != null && User.Identity.IsAuthenticated )
{ 
//Code Goes Here!
}

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

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

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

Другие вопросы по тегам