2010-03-09 21 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有一個簡單的方法來做你想做的事情的更多信息。

相關問題