【问题标题】:How do I store an OWIN OAuth 2 access_token in an HttpOnly Secure cookie?如何将 OWIN OAuth 2 access_token 存储在 HttpOnly Secure cookie 中?
【发布时间】:2020-12-12 13:21:57
【问题描述】:

我的主要目标是正确保护一系列 Web API 控制器。到目前为止,我已经使用 OWIN 生成 access_tokens 并通过使用 [Authorize] 装饰一个类来测试功能,然后使用在标头中包含 Bearer 令牌的 jQuery ajax 调用来调用它。这似乎是正确的道路,但我读过本地存储并不安全。相反,标记为 HttpOnly 和 Secure 的 cookie 似乎是最受欢迎的解决方案。

我已经能够找到人们正在使用本地存储的提及,甚至是浏览:

https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/individual-accounts-in-web-api

我一直没能找到的是如何配置 OWIN 以使用 cookie 来存储令牌。

【问题讨论】:

    标签: security cookies oauth-2.0 owin bearer-token


    【解决方案1】:

    服务器端架构

    OWIN 堆栈会将您绑定到基于 cookie 的安全性,并像这样工作。这可能非常适合您的要求:

    • Web UI 对 Web 后端进行 Ajax 调用并隐式发送 auth cookie
    • Web UI 仅限于调用同一域中的 Web 后端
    • Web 后端从 cookie 获取访问令牌
    • Web 后端将访问令牌转发到不同域中的 API
    • API 验证访问令牌

    this thread 中演示了一种常用方法,其中令牌包含在 auth cookie 中,Web 后端从令牌中解压缩 cookie。

    var id = new ClaimsIdentity(n.AuthenticationTicket.Identity.AuthenticationType);
    
    id.AddClaim(new Claim("access_token", tokenResponse.AccessToken));
    id.AddClaim(new Claim("refresh_token", tokenResponse.RefreshToken));
    id.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken));
    

    要求?

    我总是建议从目标/要求开始,而不是从微软等供应商的技术开始,这通常有点陈旧或不理想。

    客户端架构

    如果您想在客户端做更多事情,那么另一种方法是使用 SPA 架构并在 Javascript 中做更多事情:

    • 使用诸如oidc-client之类的库
    • 直接向跨域 API 发送访问令牌
    • 考虑仅将令牌存储在浏览器内存中而不是本地存储中

    如果您对这种方法在您的未来规划方面感兴趣,那么我的以下 2 篇文章是一个很好的起点:

    无论如何,如果其中任何一个有用,请随时发布后续问题。

    【讨论】:

      猜你喜欢
      • 2020-12-09
      • 1970-01-01
      • 2019-06-03
      • 2021-11-17
      • 1970-01-01
      • 2014-02-04
      • 2021-10-16
      • 2021-02-11
      • 2013-07-19
      相关资源
      最近更新 更多