【问题标题】:ASP.Net Store User Password in Session cookie?ASP.Net 在会话 cookie 中存储用户密码?
【发布时间】:2011-12-28 02:05:29
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 当用户首次通过身份验证时,我会将它们保存到会话状态吗?您如何确保成员资格会话与会话状态同时到期?我相信我需要它们保持同步。
    • @metalideath - 是的,尽快存储它们。如果会话结束,无论是用户清除了他们的 cookie(因此丢失了对其会话的任何引用)还是服务器超时会话,您将需要重新验证用户并再次恢复会话中的密码。
    • @metalideath:只有你把它放在 SQL Server 中(这对密码来说不是一个好主意)
    • 那么我认为会话状态对我不起作用。我需要一个可扩展的解决方案。
    【解决方案2】:

    是的,你可以这样做。您在 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。服务器使用该键来获取该会话唯一的键/值对字典,该字典保留在服务器上(或序列化到数据库,具体取决于它的配置方式)。

    【讨论】:

    • 感谢使用会话状态的示例,为此 +1。
    【解决方案3】:

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

    【讨论】:

    • 据我所知,这不是 SLaks 推荐的吗?我真的不明白会员提供的会话和“会话状态”之间的区别。也许没有区别,这让我感到困惑。
    • @metalideath。会话 Cookie 与表单身份验证 Cookie 非常不同。阅读 Stefan Schackow 书中的“表单身份验证”一章以获得完整的理解。
    • @metalideath:这直接进入客户端上的表单身份验证 cookie。我不会推荐它。
    • 我不明白为什么不推荐它。 cookie 是 AES 加密的,因此很安全。这是否会使服务器扩展更难实现?
    • @metalideath,正确的是 ASP.NET AUTH cookie 已加密和验证(签名)。所以几乎不可能创建这些类型的票。但是如果用户能够以某种方式解密这张票,那么他就会知道你的用户名/密码,这是你能想到的最糟糕的情况。所以,要小心。请参阅 1.0 版本中的建议 ASP.NET 团队成员建议。 forums.asp.net/t/326633.aspx/1。此外,使用 UserData 也有一些限制。 msdn.microsoft.com/en-us/library/…
    猜你喜欢
    • 2014-11-30
    • 1970-01-01
    • 2012-01-22
    • 2015-06-12
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多