【发布时间】:2017-12-29 14:11:17
【问题描述】:
我的 Web API 由 Node 进程中托管的 Angular 客户端访问,因此我正在生成防伪令牌作为 OAuth 令牌生成的一部分,并将它们作为 cookie 附加到响应中,如下所示:
public static void SetXsrfCookies(IOwinResponse response, DateTime expiresUtc)
{
string cookieToken;
string formToken;
AntiForgery.GetTokens("", out cookieToken, out formToken);
response.Cookies.Append(AntiForgeryConfig.CookieName, cookieToken,
new CookieOptions()
{
HttpOnly = true /* we want JavaScript clients to read this cookie*/,
Expires = expiresUtc
});
response.Cookies.Append("FORM-TOKEN", formToken,
new CookieOptions()
{
HttpOnly = true /* we want JavaScript clients to read this cookie*/,
Expires = expiresUtc
});
}
我看到客户端正在接收 cookie。
然后对于后续调用,我包括以下标题:
Authorization: Bearer someOAuthToken
Content-Type: application/json
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36
Cache-Control: no-cache
__RequestVerificationToken: someCookieToken
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8
Cookie: Logout=true; __RequestVerificationToken=someFormToken
可以注意到,我在标题中包含了 cookieToken 和 formToken。
当客户拨打电话时,我会验证这些令牌,如下所示(此代码根据其他 SO 人的讨论):
var headers = actionContext.Request.Headers;
var cookie = headers.GetCookies()
.Select(c => c[AntiForgeryConfig.CookieName])
.FirstOrDefault();
var aspNetMvcRequestVerificationToken = headers.GetValues(AntiForgeryConfig.CookieName).FirstOrDefault();
AntiForgery.Validate(cookie != null ? cookie.Value : null, aspNetMvcRequestVerificationToken);
此方法失败并出现以下错误
“验证提供的防伪令牌失败。cookie“__RequestVerificationToken”和表单字段“__RequestVerificationToken”已交换。”
在此之后,我尝试交换但出现以下错误:
“所提供的防伪令牌适用于与当前用户不同的基于声明的用户。”
我看到很少有人报告类似错误:link 但不确定解决方案。有人可以查看上面的代码并让我知道错误。
注意:我使用 Fiddler 进行测试。
谢谢
【问题讨论】:
标签: cookies asp.net-web-api antiforgerytoken