【问题标题】:Security: ASp.NET Identity HTTPOnly Cookie with SSL安全性:带有 SSL 的 ASp.NET Identity HTTPOnly Cookie
【发布时间】:2016-11-25 19:45:10
【问题描述】:

这是一个普遍的问题,因为我习惯于将用户对象存储在会话中,并且我正在学习新的身份框架。

我看到很多关于将“声明”作为 cookie 的一部分发送的讨论。这样您就不必重新查找用户信息,这意味着姓名、电子邮件或什至权限等内容是保存的 cookie 中声明区域的一部分。

我所研究的一切都表明,通过 SSL 的 httpOnly 在被黑客入侵方面非常安全。我很犹豫,除了发送用户 ID 之外的任何内容来识别用户,然后在数据库中查找其余内容,以确保至少如果用户被黑客入侵,权限不会被黑客入侵。我是不是太谨慎了?

我还看到有人将 cookie 设置为在 7 天或 1 天等后过期...就此而言,您正在发送声明区域中的权限/角色。如果它们在服务器上发生变化会发生什么。基本上,用户似乎需要登录和注销才能获得新的权限。想知道这是软件 UI 标准的规范期望吗?

提前感谢您的想法:)

安吉拉

【问题讨论】:

    标签: asp.net asp.net-identity httpcookie


    【解决方案1】:

    请原谅我的无知,但我还没有遇到过可以在 cookie 中发送声明的软件。通常,cookie 的问题在于XSS(跨站点脚本)攻击的可能性,因为浏览器被编写为始终发送它们。

    现在人们倾向于使用联合身份验证机制,其中身份提供者(登录页面)和服务提供者(应用程序代码)不一定是同一个应用程序,并且并不总是直接连接。这意味着您可以在数据库中查找的用户数据仅存在于 IdP 中,SP 必须处理 IdP 提供的任何内容。

    这就是为什么在“声明”中发送每一位信息的原因。这意味着 IdP 声称用户名是 john.smith,但 SP 可能无法通过任何方式对此进行检查。

    为了使其工作,IdP 和 SP 应该建立某种形式的信任,通常以预共享签名密钥的形式,允许 IdP 签署令牌(例如 SAML 信封或 JWT),并且 SP 可以验证签名以便能够检查令牌是否被篡改。

    通常,此令牌从不用作 cookie;相反,它被添加到Authorization 标头中,通常使用Bearer 方案。

    另外,作为旁注 - 当您说您熟悉使用会话时,您必须了解会话跟踪器也是一个 cookie(在 ASP.NET 中)。服务器将有关用户的信息存储在应用程序池的内存缓存中,并且浏览器不断发送 cookie 说“我在这里”。因此,在安全方面,简单地使用 cookie 或使用 cookie + session 之间存在可比性。当然有人可能会争辩说 cookie 可能会泄露信息,但应用程序总是可以标记数据或加密整个 cookie 来否定这个论点。

    【讨论】:

    • @zaitman,感谢您抽出宝贵时间 :) 我研究了令牌和授权标头,发现了同样的事情。提倡将用户权限添加到“有效负载”中,这样​​用户就不必每次请求都重新加载。至于 Cookies 与 Authorization 标头。据我了解,授权标头可以被 XSS 破解,因为它可以通过客户端读取,这就是为什么他们对其进行加密并提供签名以验证它是真实的。你可以做 _request.getResponseHeader(name)。使用 HTTPOnly 和 SSL 时无法读取 cookie。
    • @Angela 虽然禁止为客户端读取此类 cookie 绝对是一个指导方针,但此特定实现细节由客户端编写者自行决定。例如。在 iOS WebView 中,您可以轻松地从本机代码访问这些 cookie。令牌也很有用,因为它们可以普遍用于需要与浏览器无关的交互的情况,例如用于代码流或刷新令牌流。它们绝对不是“更好”,也不是更安全,它们只是提供额外的机制,主要好处是允许用户使用外部帐户登录。
    • 将权限传递给令牌或 cookie 是规范/标准吗?在网上,人们提倡使用 Tokens 来传递用户数据,这样您就不必在随后的调用中再次访问数据库。我对 cookie 也有同样的看法。也许我是一个老前辈,但我想如果它被黑了,我当然不想开放被弄脏的权限。也许他们得到了用户,但至少他们无法获得权限。因此,在为该人执行操作之前,每次都强制数据库调用返回服务器以获取权限。
    • @Angela 如果您的设计足够安全,那么是的,您可以将权限放入令牌中。然而,它完成的主要原因并不是你不必“访问数据库”,而是因为 IdP 数据库实际上并不存在于你的应用程序中。当然,如果你使用令牌,它们总是被签名(至少),你可以对它们进行加密,这也会导致用户无法看到这些值。
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2021-08-26
    • 2013-01-19
    • 2020-05-14
    • 1970-01-01
    • 2021-06-23
    • 2012-10-13
    相关资源
    最近更新 更多