如何在.net API和SPA解决方案中使用cookie作为身份验证来进行Anti-CSRF?

问题描述 投票:0回答:1

我有一个 .NET API 和 React SPA 托管在同一域(api.domain.com 和 app.domain.com)上。

我使用 same-site=strict、secure 和 httponly cookie 来进行从 SPA 到 API 的通信。我还设置了严格的 CORS 规则。我还想添加防伪令牌,但找不到任何好的解决方案。所以我想做的是:

  1. 用户登录后,调用端点 /api/csrf 获取反 csrf 令牌。这将被放置在本地存储中。
  2. 在每个请求上,将其附加为标头
  3. 当收到请求时,使用中间件:检查用户是否通过 cookie 进行身份验证(我还必须支持使用不记名令牌调用 API 的守护进程应用程序,在这些情况下,跳过 CSRF 检查),并检查令牌是否通过已验证。如果不是,则返回 400/401。

我正在使用 OpendIdConnect 通过针对 AD FS 的身份验证代码流发出 cookie。 MS OIDC 库是否也有办法发行防伪令牌?如果没有,我是否可以只创建令牌并将它们添加到内存缓存中,并且仅当令牌存在于缓存中时才允许 cookie 请求?还是这太“宽松”的 CSRF 检查?

reactjs .net security openid-connect csrf
1个回答
0
投票

使用防伪令牌(CSRF 令牌)是保护您的应用程序免受 CSRF 攻击的良好实践。但是,.NET 中的 OIDC (OpenID Connect) 库并不直接处理 CSRF 令牌。您需要在应用程序中单独实现 CSRF 保护。

从端点获取 CSRF 令牌并将其存储在本地存储中的方法是合理的。以下是增强它的方法:

获取 CSRF 令牌:用户登录后,向 /api/csrf 端点发出请求以获取 CSRF 令牌。将此令牌安全地存储在本地存储中。

将 CSRF 令牌附加到请求:将 CSRF 令牌作为标头包含在从 React SPA 到 .NET API 的每个请求中。

CSRF 令牌验证中间件:在 .NET API 中实现中间件来验证 CSRF 令牌。这个中间件应该:

检查用户是否通过 cookie 进行身份验证。 检查请求标头中的 CSRF 令牌是否与用户会话中存储的令牌匹配(您可以为此使用内存缓存)。 如果令牌无效或丢失,则返回 400/401 响应。 跳过守护程序应用程序的 CSRF 检查:对于来自具有不记名令牌的守护程序应用程序的请求,您可以跳过 CSRF 检查,因为 CSRF 保护在此上下文中不相关。

关于您关于 CSRF 检查的“松散性”的问题,使用内存缓存来存储 CSRF 令牌并对其进行验证是一种常见的方法。但是,请确保正确管理和清除缓存,以防止内存泄漏和潜在的安全问题。此外,考虑实施额外的安全措施,例如令牌过期和重新生成,以减轻 CSRF 风险。

总体而言,虽然 OIDC 库不直接处理 CSRF 令牌,但您可以使用概述的方法实施 CSRF 保护,以增强应用程序的安全性。

© www.soinside.com 2019 - 2024. All rights reserved.