【问题标题】:Store username and password ASP.NET authentication存储用户名和密码 ASP.NET 身份验证
【发布时间】:2011-01-12 08:01:01
【问题描述】:

我有一个服务 (WCF),我的 ASP.NET 页面将与之通信。 WCF 服务在其数据存储(实际上是一个文件)中具有散列密码。 WCF 服务在每次调用时都需要用户名和散列密码。

现在我遇到的问题是,如果我在 ASP.NET 中使用表单身份验证对用户进行身份验证,则在用户通过身份验证后,cookie 将保存在用户的计算机中,但我想保存用户名和哈希密码以便用户可以使用 WCF 服务。应该将这些信息保存在哪里,以确保其安全可靠?

我应该使用会话变量吗?如果我选择该选项,那么我应该从基于表单的身份验证切换并使用会话变量手动进行身份验证使用基于表单的身份验证进行网页访问并将用户名和哈希密码存储在会话中多变的?各有什么优缺点?

【问题讨论】:

    标签: asp.net wcf authentication


    【解决方案1】:

    您可以将用户名和密码(当然是散列)存储在另一个 cookie 中吗?每次通信时,获取 cookie 并将其与用户名一起发送到 WCF 服务。

    在 WCF 服务端,您将拥有用户名和散列的用户名/密码组合。如果您应用相同的散列,您应该得到与存储在 WCF 端相同的字符串,如果它们匹配用户是有效的。

    关于您的编辑:

    不确定它们之间是否像您建议的那样有很大区别。如果您使用表单身份验证,则会创建一个会话变量,并且(假设您正在使用 cookie)存储一个允许会话变量与用户相关联的 cookie。因此,即使使用表单身份验证,您仍在使用会话变量。

    唯一的问题是,如果您想将用户输入的密码的散列版本存储在会话/cookie 中。优点是它被存储在某个地方,这可能会带来安全风险。

    一种完全替代的方法是发送一个与用户密码无关的身份验证令牌,而不是在每次请求时发送密码和重新身份验证。请改为验证此令牌。

    令牌可以在成功登录时发出,并且应该使用与 WCF 相同的哈希算法。将用户名和令牌作为请求的一部分发送,并验证它是否有效、已授权且仍然是最新的。

    【讨论】:

    • 您能否详细说明如果我使用令牌而不是散列密码会有什么优势?我仍然需要将令牌保存在会话或 cookie 中的某个位置。
    • 您可以在不更改用户密码的情况下使令牌无效,用户的密码可能与他们在任何地方使用的密码相同。如果另一个用户泄露了用户的令牌,他们所能做的就是访问您的 API,如果他们破解了密码,他们可能能够登录到用户的网上银行。
    【解决方案2】:

    绝对不在客户端(cookies)。使用 cookie 向 ASP 和会话 ID 验证用户身份。这是 ASP.NET 的默认设置。然后将用户名和密码存储在会话中。

    考虑使用 Windows 身份验证或其他推荐的机制,因为它们会带来更高的安全性。

    @您的编辑:我建议继续使用表单身份验证以及相关控件(或 ASP.NET 中的任何其他预实现方法)。自行重新实现它会无缘无故地付出巨大的努力 - 至少如果您想获得与 .NET 身份验证带来的相同安全性。它真的不仅仅是比较散列密码..!此外,使用会话,因为这是存储任何其他用户相关数据的自然场所。再次 - 会话易于配置且相对安全。

    【讨论】:

    • 如果 cookie 是经过哈希处理的,如果没有有效的用户名就不能使用,并且不知道盐就不能使用,为什么不 cookie 呢?
    • 因为它会不必要地将敏感信息暴露给不安全的渠道。据我阅读的问题,通信只在 ASP 页面(服务器端)和 WCF 之间进行。因此,客户端无需直接与服务通信。客户应该只拥有真正需要的信息。
    猜你喜欢
    • 1970-01-01
    • 2011-10-23
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    相关资源
    最近更新 更多