Cookies 交换Web API反伪造令牌
我的Web API由节点进程中托管的Angular客户端访问,因此我正在生成防伪令牌,作为OAuth令牌生成的一部分,并将它们作为cookie附加到响应中,如下所示:Cookies 交换Web API反伪造令牌,cookies,asp.net-web-api,antiforgerytoken,Cookies,Asp.net Web Api,Antiforgerytoken,我的Web API由节点进程中托管的Angular客户端访问,因此我正在生成防伪令牌,作为OAuth令牌生成的一部分,并将它们作为cookie附加到响应中,如下所示: public static void SetXsrfCookies(IOwinResponse response, DateTime expiresUtc) { string cookieToken; string formToken; AntiForgery.GetTok
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
});
}
我看到客户收到了cookies
然后,对于后续调用,我将包括以下标题:
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人员的讨论一致):
此方法失败,错误如下
验证提供的防伪令牌失败。已交换cookie“\uu RequestVerificationToken”和表单字段“\uu RequestVerificationToken”
在此之后,我尝试交换,但出现以下错误:
“提供的防伪令牌用于与当前用户不同的基于声明的用户。”
我看过少数报告类似错误的人:但不确定解决方案。有人可以检查上面的代码,让我知道错误
注:我使用Fiddler进行测试
谢谢这是由于静态函数调用造成的
public static void SetXsrfCookies(IOwinResponse response, DateTime expiresUtc)
从函数中删除静态属性,或者最好将函数用作异步任务
public async 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
});
await response.Cookies.Append("FORM-TOKEN", formToken,
new CookieOptions()
{
HttpOnly = true /* we want JavaScript clients to read this cookie*/,
Expires = expiresUtc
});
}
我对webmethod(aspx)也有同样的问题,当多个用户根据负载调用同一个函数并调用已交换的ID时,请将静态函数更改为动态函数,希望这也适用于您
public static void SetXsrfCookies(IOwinResponse response, DateTime expiresUtc)
从函数中删除静态属性,或者最好将函数用作异步任务
public async 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
});
await response.Cookies.Append("FORM-TOKEN", formToken,
new CookieOptions()
{
HttpOnly = true /* we want JavaScript clients to read this cookie*/,
Expires = expiresUtc
});
}
我对webmethod(aspx)也有同样的问题,当多个用户根据负载调用同一个函数并调用被交换的ID时,将静态函数更改为动态函数,希望这也适用于您我检查了您的代码,发现了一些问题
我检查了你的代码,发现了一些问题
在代码行中,
“\uu RequestVerificationToken=someFormToken”
,将其更改为“RequestVerificationToken”
或其他名称。由于表单令牌和cookie令牌都具有相同的名称“\uuu RequestVerificationToken”
,因此您得到了错误。在代码行中,“\uu RequestVerificationToken=someFormToken”
,将其更改为“RequestVerificationToken”
或其他名称。由于表单令牌和cookie令牌都具有相同的名称“\uuu requestVerificationToken”
,因此您得到了错误。它与静态无关(我已更改代码并测试以确认这一点)。此外,它与任何负载无关,因为我只使用一个用户进行开发人员测试。我相信一定有其他东西帮助了你:-)你是如何等待响应的。Cookies.Append
?它与静态无关(我已经更改了代码并进行了测试以确认这一点)。此外,它与任何负载无关,因为我只使用一个用户进行开发人员测试。我相信一定还有其他东西帮了你:-)你是如何等待响应的。Cookies.Append
?