我刚刚实现了这一点,但我也在使用 aurelia。我不必为我选择的实现更改任何客户端,因此这可能对您有用,也可能对您不起作用,但它可能有助于您入门。重要的是我不必使用剃须刀
我正在使用 owin 和 oauth 进行身份验证,因此我将承载令牌发送给客户端。成功登录后,我将 xsrf 令牌设置为 cookie,如下所示:
string cookieToken, formToken;
AntiForgery.GetTokens(null, out cookieToken, out formToken);
context.Response.Headers.Append("Set-Cookie", $".XSRF-TOKEN={cookieToken}:
{formToken}; Secure; HttpOnly;");
其中 context 是 owin 上下文,这也应该与 httpContext 一起使用。我使用 System.Web.Helpers 中的 AntiForgery 来生成令牌。设置 HttpOnly 提供了额外的保护,因为它使 cookie 在 javascript 中不可用(只要浏览器支持它)
然后我在 web api 管道中创建了一个过滤器来验证 xsrf 令牌。因此,在所有未来的请求中,浏览器都会发送 .XSRF-TOKEN。
过滤器有以下功能:
static void ValidateAntiForgeryToken(HttpActionContext actionContext)
{
var owinContext = actionContext.Request.Properties["MS_OwinContext"] as OwinContext;
var xsrfTokens = owinContext.Request.Cookies[".XSRF-TOKEN"]?.Split(':');
if (xsrfTokens == null)
{
throw new HttpAntiForgeryException();
}
string cookieToken = xsrfTokens[0], formToken = xsrfTokens[1];
AntiForgery.Validate(cookieToken, formToken);
}
我得到了 owinContext,但如果你不使用 owin,你应该能够从 httpcontext 读取 cookie。这不是一个完美的解决方案,需要努力才能做到正确,但它让我开始运行,也可能对您有所帮助