如何将OWIN OAuth 2 access_token存储在HttpOnly Secure cookie中?

问题描述

我的主要目标是正确保护一系列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来存储令牌。

解决方法

服务器端架构

OWIN堆栈将使您与基于cookie的安全性联系在一起,并且可以这样工作。可能这很适合您的要求:

  • Web UI对Web后端进行Ajax调用并隐式发送auth cookie
  • Web用户界面仅限于在同一域中调用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));

要求?

我总是建议从目标/要求开始,而不是从诸如Microsoft之类的供应商那里获得技术,这通常会有些陈旧或次优。

客户端侧面架构

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

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

如果对您的未来计划感兴趣,那么我的这2个帖子是一个不错的起点:

无论如何,如果有任何用处,请随时发布后续问题。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...