web-dev-qa-db-fra.com

Comment dois-je vérifier si un utilisateur est authentifié dans MVC5?

J'ai vu les deux booléens accessibles suivants:

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

Y a-t-il une différence entre ceux-ci. Ils semblent tous les deux faire la même chose, donc je ne sais pas lequel utiliser.

Ce que je voudrais faire, c'est:

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

ou

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

Est-ce que l'un ou l'autre des éléments ci-dessus fonctionnerait aussi bien?

50
user1679941

Il n'y a aucune différence. La seule différence est que si l'utilisateur n'est pas authentifié User.Identity pourrait être nul et donc vous pourriez obtenir un NRE, alors qu'avec la deuxième approche, en interne il y a un contrôle pour cela et c'est plus sûr.

Voici comment le Request.IsAuthenticated la méthode est implémentée:

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

Fondamentalement, c'est un peu plus sûr que le premier.

65
Darin Dimitrov

La propriété IsAuthenticated pour déterminer si la demande en cours a été authentifiée. S'il n'a pas été authentifié, la demande est redirigée vers une autre page où les utilisateurs peuvent entrer leurs informations d'identification dans l'application Web. Il s'agit d'une technique courante utilisée dans la page par défaut d'une application.

mais en ce qui concerne User.Identity.IsAuthenticated

La propriété User fournit un accès par programme aux propriétés et méthodes de l'interface IPrincipal. Étant donné que les pages ASP.NET contiennent une référence par défaut à l'espace de noms System.Web (qui contient la classe HttpContext), vous pouvez référencer les membres de HttpContext sur une page .aspx sans utiliser la référence de classe complète à HttpContext. Par exemple, vous pouvez utiliser User.Identity.Name pour obtenir le nom de l'utilisateur au nom duquel le processus en cours s'exécute. Cependant, si vous souhaitez utiliser les membres d'IPrincipal à partir d'un module code-behind ASP.NET, vous devez inclure une référence à l'espace de noms System.Web dans le module et une référence complète au contexte de demande/réponse actuellement actif et à la classe dans System.Web que vous souhaitez utiliser. Par exemple, dans une page code-behind, vous devez spécifier le nom complet

3
Amit