2010-02-01 7 views
2

J'utilise asp.net et d'essayer d'attribuer des rôles pour un utilisateur avec l'authentification par formulaire comme ceci:HttpContext.User.Idenity est vide

public ActionResult AdminLogin(string password, string username) 
    { 
     User _user = _us.GetUsers(username, password).FirstOrDefault(); 

     if (_user != null) 
     { 
      string _username = _user.Username; 

      FormsAuthentication.SetAuthCookie(_username, false); 

      string[] _roles = _us.GetUserRoles(_username); 


      HttpContext.User = new GenericPrincipal(HttpContext.User.Identity, _roles); 


      return RedirectToAction("Index", "Admin"); 

Quand je debug HttpContext.User.Identity est toujours nulle, mais _username et _roles contiennent les données correctes. Comment régler ceci?

/M

Répondre

3

Votre action définit l'IPrincipal de l'utilisateur pour le contexte actuel. Dès que vous redirigez vers votre autre action (et toutes les requêtes suivantes), un nouveau HttpContext est créé avec un User IPrincipal nul. Ce que vous pouvez faire est de conserver les informations dans le cookie d'authentification, puis d'extraire ces données dans la méthode Application_AuthenticateRequest de votre fichier Global.asax et d'y définir la propriété User du HttpContext.

This answer contains more details and example code

0

Je crois que le problème est que vous définissez simplement l'utilisateur comme authentifié, et par conséquent, le HttpContext est pas encore mis à jour depuis le cookie auth n'a pas encore été mis sur le côté des utilisateurs de la demande .

+0

donc FormsAuthentication.SetAuthCookie (_username, false); ne le met pas? –

+2

il définit l'identité, mais pour les demandes FUTURE, en écrivant un cookie client. –

0

je luttais aussi.

J'essayais d'effectuer mon authentification et mon autorisation à l'intérieur d'un service WCF en utilisant des fournisseurs de rôles et d'appartenances ASP.Net standard. Je voulais transmettre les informations d'identification et une "application demandée" pour déterminer si l'utilisateur "authentifié" pour cette application. (pas l'application ASP.Net, mais une application dans ma propre base de données). Pour ce faire, je voulais accéder aux rôles, mais je ne voulais pas «rediriger» ou avoir un second appel à mon service WCF.

Voici un code qui fonctionne pour moi:

D'abord je déterminer si l'utilisateur est valide comme suit:

if (Membership.ValidateUser(CompanyCn, CompanyPwd)) 
{ 
    sbLogText.AppendFormat("\r\n\r\n\tValid User UID/PWD: '{0}'/'{1}'", CompanyCn, CompanyPwd); 
    FormsAuthentication.SetAuthCookie(CompanyCn, false); 
} 

ensuite le code suivant workes bien pour obtenir la liste des rôles:

List<string> roleList = new List<string>(Roles.GetRolesForUser(CompanyCn)); 
sbLogText.AppendFormat("\r\n\r\n\tUser ('{0}'): Roles ({1}):", CompanyCn, roleList.Count); 
foreach (string s in roleList) 
    sbLogText.AppendFormat("\r\n\t\tRole: {0}", s);