【发布时间】:2011-12-28 02:05:29
【问题描述】:
我知道会员资格提供商将用户名和过期时间存储在加密的 cookie 中,然后使用它来验证用户是否仍然登录会话。
是否也可以将用户密码存储在此加密的 cookie 中。如果是这样,您将如何访问它的服务器端?
我需要服务器端可用的用户用户名和密码,因为我需要调用使用相同凭据的 Web 服务。有没有更好的方法来做到这一点?
【问题讨论】:
标签: asp.net asp.net-mvc session-state
我知道会员资格提供商将用户名和过期时间存储在加密的 cookie 中,然后使用它来验证用户是否仍然登录会话。
是否也可以将用户密码存储在此加密的 cookie 中。如果是这样,您将如何访问它的服务器端?
我需要服务器端可用的用户用户名和密码,因为我需要调用使用相同凭据的 Web 服务。有没有更好的方法来做到这一点?
【问题讨论】:
标签: asp.net asp.net-mvc session-state
您应该将它存储在会话状态中,它永远不会离开服务器。
您还应该尝试将这些 Web 服务更改为使用身份验证票证而不是密码(例如 OAuth),因为以纯文本形式存储密码绝不是一个好主意。
【讨论】:
是的,你可以这样做。您在 FormsAuthenticationTicket 构造函数的 userData 字段中传递编码信息:
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(version,
name, issueDate, expirationDate, isPersistent, yourEncodedData);
string secureTicket = FormsAuthentication.Encrypt(ticket);
Response.Cookies.Add(
new HttpCookie(FormsAuthentication.FormsCookieName, secureTicket));
理想情况下,这应该通过 SSL 连接完成,并且票证 cookie 应该同时标记 HttpOnly 和 Secure 属性。
然后,检索值:
FormsIdentity id = (FormsIdentity)User.Identity;
FormsAuthenticationTicket ticket = id.Ticket;
string yourEncodedInfo = ticket.UserData;
您也可以设置自己的 cookie,与表单身份验证票分开。
但是,从安全角度来看,将密码直接存储在 cookie 中(即使已加密)也不是一个好主意。而是使用会话状态:
Session["password"] = password;
会话状态也使用cookie,但是cookie本身只包含一个key。服务器使用该键来获取该会话唯一的键/值对字典,该字典保留在服务器上(或序列化到数据库,具体取决于它的配置方式)。
【讨论】:
不推荐,但可以使用FormsAuthenticationTicket.UserData。
【讨论】: