2010-03-09 89 views
2

J'écris un contrôleur comme ci-dessous:Comment puis-je attribuer une valeur à HttpContext.User dans ASP.NET MVC?

public class AccountController : Controller 
{ 
    public ActionResult Login(/*---*/) 
    { 
     GenericIdentity identity = new GenericIdentity("userName"); 
     GenericPrincipal principal = new GenericPrincipal(identity, new string[] { "role1", "role2" }); 
     this.HttpContext.User = principal; 
     /*---*/; 
    } 
} 

Après la connexion, je peux obtenir le nom d'utilisateur par User.Identity.Name dans un autre contrôleur. Mais User.IsInRole ("role1") retourne toujours false.

Comment puis-je attribuer une valeur à l'utilisateur, je ne veux pas utiliser des membres ...

Répondre

1

Hm.

Utiliser l'appartenance?

Au moins l'API de niveau inférieur. Vous devez lui affecter un principal dans un événement (qui se transforme en un cookie et est désérialisé à chaque appel).

Les détails sont dans http://support.microsoft.com/kb/306590

Ou aussi dans http://msdn.microsoft.com/en-us/library/aa302399.aspx

+1

Je ne souhaite pas utiliser l'abonnement. Et je ne comprends pas l'utilisation de cookie, pourquoi ne pas le garder du côté serveur comme une session? – ldp615

+0

Eh bien, d'abord, ce que vous voulez est d'une importance limitée que vous avez décidé d'utiliser ASP.NET. En conséquence, vous devez vivre avec les décisions de conception prises par les personnes ASP.NET. Pardon. Deuxième ... Cookie de sorte que l'utilisateur PEUT rester connecté plus longtemps que la session persiste. C'est simple. Je ne déteste rien de plus que d'avoir à se connecter sur le même site encore et encore. Donc, mieux vaut mettre cela dans un cookie séparé afin que vous puissiez décider combien de temps celui-ci reste valide. Notez que vous n'avez pas besoin d'avoir les groupes - l'ID de l'utilisateur dans la base de données est suffisant, vous pouvez toujours déshydrater l'objet complet à partir de là. – TomTom

+0

Merci pour votre commentaire, j'apprends beaucoup de ça! – ldp615

5

Vous devez conserver les données d'utilisateur quelque part afin que toutes les demandes de pages ultérieures ont accès. Habituellement, vous créez un ticket d'authentification et le stockez dans un cookie. Ensuite, pour chaque requête, vous extrayez les données et créez votre IPrincipal. Cela peut être fait dans la méthode Application_AuthenticateRequest de Global.ascx,

MVC - How to store/assign roles of authenticated users a plus d'informations sur un moyen simple de faire ce que vous voulez.