ASP.Net在会话cookie中存储用户密码?

问题描述:

我知道会员提供商将用户名和过期时间存储在加密的cookie中,然后使用它来验证用户是否仍然登录进行会话。ASP.Net在会话cookie中存储用户密码?

是否可以将用户密码存储在此加密的cookie中。如果是的话,你将如何访问它的服务器端?

我需要用户的用户名和密码可用的服务器端,因为我需要调用Web服务使用这些相同的凭据。有没有更好的方法来做到这一点?

您应该将其存储在会话状态中,永远不会离开服务器。

您还应该尝试将这些Web服务更改为使用身份验证票证而不是密码(例如OAuth),因为以纯文本存储密码绝不是一个好主意。

+2

当我第一次验证用户时,会将它们保存到会话状态吗?您如何确保会员会话与会话状态同时过期?我相信,我需要他们保持同步。 – 2011-12-27 03:53:58

+0

@metalideath - 是的,尽快将它们储存起来。如果会话结束,无论是由用户清除其cookie(并因此丢失对会话的任何引用)或服务器超时会话,您需要重新验证用户身份并再次在会话中恢复密码。 – Omar 2011-12-27 05:21:05

+0

会话状态在多服务器环境中工作吗? – 2011-12-27 23:05:10

不推荐,但可以使用FormsAuthenticationTicket.UserData

+0

据我所知,这不是SLak推荐的东西吗?我不太了解会员提供的会话和“会话状态”之间的区别。也许没有什么区别,那就是让我困惑的东西。 – 2011-12-27 05:35:35

+0

@metalideath。 Session Cookie与Forms Authentication Cookie非常不同。阅读Stefan Schackow书的“Forms Authentication”章节以获得完整的理解。 – 2011-12-27 05:42:46

+0

@metalideath:这直接进入客户端上的表单身份验证cookie。我不会推荐它。 – SLaks 2011-12-27 13:42:36

是的,你可以做到这一点。您传入的FormsAuthenticationTicket构造函数的用户数据领域的编码信息:

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(version, 
    name, issueDate, expirationDate, isPersistent, yourEncodedData); 
    string secureTicket = FormsAuthentication.Encrypt(ticket); 
    Response.Cookies.Add(
     new HttpCookie(FormsAuthentication.FormsCookieName, secureTicket)); 

理想的情况下,这应该通过SSL连接来完成,而票饼干应与中HTTPOnly和安全属性标记。

然后,检索值:

FormsIdentity id = (FormsIdentity)User.Identity; 
FormsAuthenticationTicket ticket = id.Ticket; 
string yourEncodedInfo = ticket.UserData; 

你也可以只设置自己的cookie,从窗体身份验证票证分开。

但是,从安全角度来看,即使加密,直接在cookie中存储密码也不是一个好主意。相反,使用会话状态:

Session["password"] = password; 

会话状态也使用cookie,但cookie本身只包含密钥。服务器使用密钥来获取该会话唯一的键/值对的字典,该字典保留在服务器上(或者根据配置如何序列化到数据库)。

+0

感谢您使用会话状态的示例,+1 。 – 2013-08-09 16:06:03