我有一个 .NET API 和 React SPA 托管在同一域(api.domain.com 和 app.domain.com)上。
我使用 same-site=strict、secure 和 httponly cookie 来进行从 SPA 到 API 的通信。我还设置了严格的 CORS 规则。我还想添加防伪令牌,但找不到任何好的解决方案。所以我想做的是:
我正在使用 OpendIdConnect 通过针对 AD FS 的身份验证代码流发出 cookie。 MS OIDC 库是否也有办法发行防伪令牌?如果没有,我是否可以只创建令牌并将它们添加到内存缓存中,并且仅当令牌存在于缓存中时才允许 cookie 请求?还是这太“宽松”的 CSRF 检查?
使用防伪令牌(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 保护,以增强应用程序的安全性。