例如,如果用户已登录,存储用户 ID 和/或他/她的角色/组的最佳方法是什么?显而易见的方法是 cookie 和会话?还有哪些选择?
问问题
298 次
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 回答