【问题标题】:How to store a JWT with claims in a cookie using .net core如何使用 .net 核心将带有声明的 JWT 存储在 cookie 中
【发布时间】:2018-01-18 21:31:48
【问题描述】:

我在处理控制器中用于检查用户权限的声明时遇到了很多麻烦。

应用结构

我们的后端是 .NET Core,前端是 React,目前我们只允许使用支持 google 的电子邮件使用 google API 登录。我们生成一个 JWT 并将其存储在浏览器的 localStorage 中,然后在每次请求时发送它。此外,没有角色:如果您已登录,那么您就是管理员。

制作应用程序“骨架”的开发人员现已离开,这是我第一次处理安全问题。

新要求

我们现在需要实现角色和权限,似乎 MS 希望为此使用声明。我这样做并将这些声明添加到 jwt,然后在配置上添加策略,它确实有效。如果您有特定的声明,您可以访问特定的控制器或方法,否则服务器会返回 403 错误。

但后来我以实际管理员角色登录,使用 devtools 复制了 localStorage 值,然后以几乎没有权限的用户注销并重新登录。当我粘贴本地存储条目(再次使用 devtools)时,我立即收到了所有声明,并且能够访问管理员可以访问的每个控制器和方法。

似乎正确的方法应该是使用 HttpOnly、安全 cookie,也许将“SameOrigin”设置为 true(不确定这如何影响单点登录),但我不明白 如何 em> 这样做。我看过博客文章,甚至下载了一个应用程序(我无法运行但我将代码复制到我的应用程序),但我一直失败。此外,我不明白在检查控制器策略时是否需要为要使用的 cookie 做任何事情。

谁能帮我解决这个问题?

【问题讨论】:

    标签: reactjs cookies asp.net-core jwt


    【解决方案1】:

    问题是,如果攻击者能够进入用户的浏览器,他/她可能会造成比窃取 access_token 更大的损害。检查 Auth0.com 上的 this thread。基本上:

    假设您可以从某人的浏览器中窃取 JWT。 根据您的操作方式,可能有两种情况:

    1. 您可能会造成比盗取令牌更大的伤害。
    2. 您不是,想象一下,如果您的实际密码被盗而不是存储 JWT,那会更糟。

    主要区别在于 cookie 更容易受到 XSRF 的攻击,而 JWT 更容易受到 XSS 的攻击。

    另外,如果您选择 cookie 而不是 JWT,还有一句有用的话:

    cookie 的优点是:

    • 假设您愿意使用 HttpOnly cookie,则可以更安全地抵御 XSS

    缺点是:

    • 您无法在 JS 代码中访问 JWT。
    • 您需要保护请求免受 CSRF 的影响,因为标头方法不易受此攻击,但 cookie 易受攻击。
    • 您的 API 代码需要处理来自 cookie(来自浏览器)或来自标头(调用您的 API 的其他服务器需要 使用标题)。
    • 如果您的 API 与您的网站位于同一域中,则 Cookie 可以工作。如果 API 位于不同的域中,则它不可用。

    当谈到从 cookie 而不是 http 标头验证 JWT 的第三点时,您需要修改中间件,如 here 所述。

    就个人而言,如果您使用 ReactJS,我会保留 JWT 模型,因为它更多的是 suitable 用于 SPA 应用程序。处于您描述的情况:“当我粘贴本地存储条目(再次使用 devtools)时,我立即收到所有声明”基本上意味着攻击者正坐在计算机前,在这种情况下窃取 JWT 令牌变得无关紧要。

    请记住,您需要为 JWT 令牌设置过期日期,然后就可以了。

    【讨论】:

      猜你喜欢
      • 2019-07-18
      • 2018-05-22
      • 2019-07-06
      • 2022-12-25
      • 2019-04-26
      • 2020-12-09
      • 1970-01-01
      • 2017-01-26
      • 2020-05-01
      相关资源
      最近更新 更多