【问题标题】:How do store a value throughout an asp.net mvc (razor 3) application?如何在整个 asp.net mvc (razor 3) 应用程序中存储值?
【发布时间】:2013-03-28 02:51:00
【问题描述】:

例如,如果用户已登录,那么存储用户 ID 和/或他/她的角色/组的最佳方法是什么?显而易见的方法是 cookie 和会话?还有哪些选择?

【问题讨论】:

  • 如果你想存储每个用户的值,我认为这些是最好的选择
  • 我没有完全按照,你能给我举个例子吗?
  • 我在答案中添加了更多细节...

标签: asp.net-mvc-3 session-state


【解决方案1】:

如果您想存储每个用户的值,I session 是最好的选择。会话是基于每个用户/浏览器创建的。每个用户都有自己的会话对象,因此您可以在整个应用程序中保留用户角色信息,直到会话结束。

我绝对不建议将用户安全信息存储在 cookie 中,因为这会在您的应用程序中造成很大的安全漏洞。

【讨论】:

    【解决方案2】:

    至少,使用 Forms 身份验证,您可以将用户 ID 和角色放入 Formst Auth Ticket 中。

    这是我如何做到的一个例子:

        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、用户名、用户标识、角色、expireAt)。但如果您想跟踪用户何时登录/注销,或者您使用自己的身份验证(不是表单身份验证),这种方法更适合。

    【讨论】:

    • 谢谢你的例子和解释!
    猜你喜欢
    • 1970-01-01
    • 2020-06-22
    • 2010-11-10
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多