1

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

4

2 回答 2

0

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

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

于 2013-04-05T16:00:11.400 回答
0

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

于 2013-04-06T08:38:07.613 回答