2010-03-09 43 views
2

我写了一个控制器,象下面这样:如何在ASP.NET MVC中为HttpContext.User分配一个值?

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; 
     /*---*/; 
    } 
} 

登录后,我可以通过User.Identity.Name其他控制器获得用户名。 但User.IsInRole(“role1”)总是返回false。

我怎么能值分配给用户,我不想用会员...

回答

1

嗯。

使用会员?

至少是较低级别的API。您需要在某个事件中为其分配一个主体(基本上变成一个cookie,并在每次调用时都反序列化)。

详细信息可在http://support.microsoft.com/kb/306590

或者还http://msdn.microsoft.com/en-us/library/aa302399.aspx

+1

我不想使用会员资格。 而我不明白关于使用cookie,为什么不保持它在服务器端像会议? – ldp615 2010-03-09 13:35:49

+0

嗯,首先 - 当你决定使用ASP.NET时,你想要的重要性是有限的。因此,您必须接受ASP.NET人员的设计决策。抱歉。第二... Cookie,以便用户可以保持登录时间长于会话持续时间。那很简单。我讨厌的只能是一次又一次地登录到同一个网站。所以,最好把它放到一个单独的cookie中,这样你就可以决定这个保持有效的时间。请注意,您不需要在那里设置组 - 用户在数据库中的标识就足够了,您可以始终从中完成整个对象的脱水。 – TomTom 2010-03-09 13:50:16

+0

感谢您的评论,我从中学到了很多! – ldp615 2010-03-11 04:17:53

5

你需要在一些地方保存用户数据,让所有后续页面请求访问它。通常您会创建一个身份验证票并将其存储在Cookie中。然后为每个请求提取数据并创建您的IPrincipal。这可以在Global.ascx的Application_AuthenticateRequest方法中完成,

MVC - How to store/assign roles of authenticated users有一个简单的方法来做你想做的事情的更多信息。