web-dev-qa-db-fra.com

HttpContext.Current.User.Identity.Name est toujours string.Empty

Bonjour, j'utilise un MembershipProvider personnalisé.

Je souhaite connaître le nom d'utilisateur actuel lors d'un scénario d'application, mais lorsque j'essaie d'accéder à HttpContext.Current.User.Identity.Name, il retourne toujours string.Empty.

if (Membership.ValidateUser(tbUsername.Text, tbPassword.Text))
{
    FormsAuthentication.SetAuthCookie(tbUsername.Text, true);
    bool x = User.Identity.IsAuthenticated; //true
    string y = User.Identity.Name; //""
    FormsAuthentication.RedirectFromLoginPage(tbUsername.Text, cbRememberMe.Checked);
}

Est-ce que je manque quelque chose?

26
Shimmy
FormsAuthentication.SetAuthCookie(tbUsername.Text, true);
bool x = User.Identity.IsAuthenticated; //true
string y = User.Identity.Name; //""

Le problème que vous rencontrez est que vous définissez uniquement le cookie d'authentification à ce stade. L'IPrincipal créé dans le module d'authentification par formulaire ne se produira pas tant qu'une nouvelle demande n'aura pas été reçue. . Une fois la redirection effectuée, comme il s’agit d’une nouvelle demande du navigateur, le cookie sera lu avant que votre page ne soit atteinte et que l’objet utilisateur approprié ne soit créé.

Les cookies ne sont configurés sur le navigateur qu’une fois la demande complétée.

De plus, RedirectFromLoginPage crée un cookie d'authentification de formulaire, vous n'avez pas besoin de le faire manuellement.

34
blowdart

Veuillez essayer System.Web.HttpContext.Current.Request.LogonUserIdentity.Name au lieu de User.Identity.Name. Cela a fonctionné pour moi.

21
sathya

La valeur de HttpContext.Current.User.Identity.Name est définie par l'appel à RedirectFromLoginPage. Vous pouvez obtenir l'ID utilisateur actuel à partir de HttpContext.Current.User.Identity.Name une fois que vous êtes redirigé vers une nouvelle page. Je ne suis pas sûr de savoir pourquoi vous auriez besoin d'accéder au nom d'utilisateur via la propriété User dans ce contexte. Ne pouvez-vous pas simplement utiliser la valeur contenue dans tbUsername.Text?

8
Phaedrus

dans la version 2015 de VS Community, si vous créez une application de formulaires Web, elle ajoute automatiquement des codes dans le noeud web.config pour supprimer FormsAuthentication. Essayez de supprimer la section ci-dessous.

<modules>
  <remove name="FormsAuthentication"/>
</modules>
2
Bo Hu

Comme déjà suggéré la méthode FormsAuthentication.RedirectFromLoginPage(), définit le cookie d'authentification automatiquement.

Cependant, dans mon cas, j’avais imbriqué des applications Web où j’avais effacé la balise <httpModules> dans une application enfant (pour qu’elle n’hérite pas de httpModules de son application parente) dans le fichier web.config. Supprimer le parent indésirable httpModules a tout fait fonctionner à nouveau.

il vaut mieux vérifier cette balise avant de compliquer les choses :)

1
Bravo

Si vous utilisez une réécriture d'URL ou modifiez votre URL, il est possible que la valeur renvoyée soit vide. Vous devez essayer de modifier le chemin de votre URL de .html à .aspx ou aucune extension. c’est un problème pour mon cas. Vous essayez. J’espère que cela vous sera utile.

0
Hoang Quan

Si vous recherchez le nom de l'utilisateur auprès du fournisseur d'adhésion, essayez quelque chose comme ça ...

var user = Membership.GetUser( HttpContext.Current.User.Identity.Name );
0
JP Alioto