Cookies 交换Web API反伪造令牌

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

我的Web API由节点进程中托管的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
            });
    }
我看到客户收到了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时,将静态函数更改为动态函数,希望这也适用于您

我检查了您的代码,发现了一些问题

  • 您在请求头中设置了someCookieToken,并在cookie中设置了someFormToken,因此您确实错误地交换了cookie令牌和表单令牌。您应该在cookie中设置someCookieToken,并在请求头中设置someFormToken
  • 您使用方法Antifforgery.GetTokens创建cookie令牌和表单令牌,我只找到您将它们添加到cookie中的代码,但我找不到您如何将\u RequestVerificationToken设置到请求头中的代码。因此,我认为您在请求中添加的cookie令牌和表单令牌不是正确的一对
    我检查了你的代码,发现了一些问题

  • 您在请求头中设置了someCookieToken,并在cookie中设置了someFormToken,因此您确实错误地交换了cookie令牌和表单令牌。您应该在cookie中设置someCookieToken,并在请求头中设置someFormToken
  • 您使用方法Antifforgery.GetTokens创建cookie令牌和表单令牌,我只找到您将它们添加到cookie中的代码,但我找不到您如何将\u RequestVerificationToken设置到请求头中的代码。因此,我认为您在请求中添加的cookie令牌和表单令牌不是正确的一对
    在代码行中,
    “\uu RequestVerificationToken=someFormToken”
    ,将其更改为
    “RequestVerificationToken”
    或其他名称。由于表单令牌和cookie令牌都具有相同的名称
    “\uuu RequestVerificationToken”
    ,因此您得到了错误。

    在代码行中,
    “\uu RequestVerificationToken=someFormToken”
    ,将其更改为
    “RequestVerificationToken”
    或其他名称。由于表单令牌和cookie令牌都具有相同的名称
    “\uuu requestVerificationToken”
    ,因此您得到了错误。

    它与静态无关(我已更改代码并测试以确认这一点)。此外,它与任何负载无关,因为我只使用一个用户进行开发人员测试。我相信一定有其他东西帮助了你:-)你是如何等待
    响应的。Cookies.Append
    ?它与静态无关(我已经更改了代码并进行了测试以确认这一点)。此外,它与任何负载无关,因为我只使用一个用户进行开发人员测试。我相信一定还有其他东西帮了你:-)你是如何等待
    响应的。Cookies.Append