2013-04-05 51 views
1

例如,如果用戶登錄,存儲用戶ID和/或他/她的角色/組的最佳方法是什麼?顯而易見的方法是Cookie和會話?還有其他的選擇如何在整個asp.net mvc(剃鬚刀3)應用程序中存儲值?

+0

如果你想存儲每個用戶的價值,我認爲這些是最好的選擇 – pollirrata 2013-04-05 15:50:38

+0

我不完全遵循,你能給我一個例子嗎? – Chaka 2013-04-05 15:54:35

+0

我在答案中添加了更多詳細信息... – pollirrata 2013-04-05 16:00:27

回答

0

至少,使用Forms Authentication可以將用戶ID和角色放在Formst Auth票證中。

Here'a的我是如何做的一個例子:

public static HttpCookie CreateCookie(IUserIdValue userId, string name, IEnumerable<int> group, bool isPersistent = false) 
    { 
     var user = new AuthenticationTicketData() { Groups = @group, UserId = userId }; 
     var ft = new FormsAuthenticationTicket(2, name, DateTime.Now, DateTime.Now.Add(FormsAuthentication.Timeout), 
               isPersistent, user.Pack()); 
     var ck = new HttpCookie(FormsAuthentication.FormsCookieName) 
        { 
         Value = FormsAuthentication.Encrypt(ft), 
         Path = FormsAuthentication.FormsCookiePath, 
         Domain = FormsAuthentication.CookieDomain 
        }; 
     if (isPersistent) 
     { 
      ck.Expires = DateTime.Now.Add(FormsAuthentication.Timeout); 
     } 
     return ck; 
    } 


public static string Pack(this AuthenticationTicketData data) 
    { 
     if (data == null) throw new ArgumentNullException("data"); 
     return String.Format("{0};{1}",PackUserId(data.UserId),string.Join(",",data.Groups)); 
    } 

    static string PackUserId(IUserIdValue uid) 
    { 
     if (uid == null) throw new ArgumentNullException("uid"); 
     var tpn = uid.GetType().GetFullTypeName(); 
     return String.Format("{0}|{1}",tpn,uid.ToString()); 
    } 

public static HttpCookie SetAuthCookie(this HttpResponse response,IUserIdValue userId, string name, IEnumerable<int> group, bool isPersistent = false) 
    { 
     var ck = CreateCookie(userId, name, group, isPersistent); 
     response.AppendCookie(ck); 
     return ck; 
    } 

另一種選擇是保留用戶會話在數據庫中(沒有聯繫到會議),就像一個表(GUID,用戶名,用戶ID ,角色expireAt)。但是,如果您想要跟蹤用戶何時登錄/註銷,或者您是否使用自己的身份驗證(而不是表單身份驗證),則此方法更合適。

+0

感謝您的示例和說明! – Chaka 2013-04-08 12:45:06

0

如果你想存儲每個用戶的價值,我會議是最好的選擇。會話是在每個用戶/瀏覽器的基礎上創建的。每個用戶都有他/她自己的會話對象,這樣您就可以在應用程序之間保留用戶角色信息,直到會話結束。

我絕對不會建議將用戶安全信息存儲在cookie中,因爲這會在您的應用程序中造成很大的安全漏洞。