当前位置: 首页 > 知识库问答 >
问题:

带有Angular 4的.NET CORE API-cookie令牌和请求令牌已交换

郤仰岳
2023-03-14

当我尝试用Angular和Angular实现XSRF时,我一直得到这个消息。NET CORE:“验证提供的反伪造令牌失败。已交换cookie令牌和请求令牌。”我在Angular和API中都配置了相同的cookie和头名称。有人有什么想法吗?

过程

Angular对此API方法进行初始调用以检索cookie

    [HttpGet("startSession")]
    public async Task<IActionResult> StartSession()
    {
        AntiforgeryTokenSet tokens = this.antiForgery.GetAndStoreTokens(this.HttpContext);

        this.HttpContext.Response.Cookies.Append(this.options.Value.Cookie.Name, tokens.RequestToken, new CookieOptions { HttpOnly = false });

        return this.Ok(
            new
            {
                Success = true
            });
    }

Angular然后截取下一个POST请求并稍微覆盖默认的XSRF处理,因为我需要它来处理HTTPS URL

    // Override default Angular XSRF handling since it won't work for         
    absolute URLs and we have to prefix with "https://"
    // Source:https://github.com/angular/angular/blob/master/packages/common/http/src/xsrf.ts
    @Injectable()
    export class HchbHttpXsrfInterceptor implements HttpInterceptor {
    constructor(
    private tokenService: HttpXsrfTokenExtractor) {}

    intercept(req: HttpRequest<any>, next: HttpHandler): 
    Observable<HttpEvent<any>> {
    const headerName = 'X-XSRF-TOKEN';
    const lcUrl = req.url.toLowerCase();
    // Skip both non-mutating requests.
    // Non-mutating requests don't require a token
    // anyway as the cookie set
    // on our origin is not the same as the token expected by another origin.
    if (req.method === 'GET' || req.method === 'HEAD' ) {
         return next.handle(req);
    }
    const token = this.tokenService.getToken();

    // Be careful not to overwrite an existing header of the same name.
    if (token !== null && !req.headers.has(headerName)) {
       req = req.clone({headers: req.headers.set(headerName, token)});
    }
    return next.handle(req);
    }
    }

共有1个答案

齐凯康
2023-03-14

我遇到了同样的问题,我想我找到了问题。选项。饼干。addAntiforgery中的名称必须与使用上下文手动设置的cookie不同。回应。饼干。追加

尝试更改其中一个的名称,它将起作用。现在,您将覆盖使用选项生成的cookie。曲奇名称使用标记命名。请求令牌值。

您可以注意到开发人员工具中的差异。

  • 使用选项生成的默认令牌。饼干。名称标记为超文本传输协议HttpOnly=true
  • 使用上下文手动附加的令牌。回应。饼干。追加被标记为HttpOnly=false

第二个是从JS/Angular读取的(您可以在JS中读取它,因为HttpOnly=false在ajax请求中作为头发送,并根据无法从JS读取的默认头进行验证)

 类似资料:
  • 我正在构建一个使用JWT进行身份验证的应用程序。我开始做一些研究,但对于诸如刷新令牌和令牌存储之类的主题缺乏共识,我感到惊讶。 据我所知,JWT和OAuth是两个不同的协议,它们遵循不同的规范。 但我的问题是,对于一个没有通过第三方资源服务器如Google、Facebook等认证的应用程序,有一个刷新令牌真的有用吗?为什么不让JWT令牌像刷新令牌一样持续时间长。 另一方面,我可以看到,如本文所述,

  • 客户端通过使用按附录B“application/x-www-form-urlencoded”格式在HTTP请求实体正文中发送下列UTF-8字符编码的参数向令牌端点发起请求: grant_type 必需的。值必须设置为“client_credentials”。 scope 可选的。如3.3节所述的访问请求的范围。 客户端必须如3.2.1所述与授权服务器进行身份验证。 例如,客户端使用传输层安全发起如

  • 客户端通过使用按附录B“application/x-www-form-urlencoded”格式在HTTP请求实体正文中发送下列UTF-8字符编码的参数向令牌端点发起请求: grant_type 必需的。值必须设置为“password”。 username 必需的。资源所有者的用户名。 password 必需的。资源所有者的密码。 scope 可选的。如3.3节所述的访问请求的范围。 如果客户端类

  • 客户端通过使用按附录B“application/x-www-form-urlencoded”格式在HTTP请求实体正文中发送下列UTF-8字符编码的参数向令牌端点发起请求: grant_type 必需的。值必须被设置为“authorization_code”。 code 从授权服务器收到的授权码。 redirect_uri 必需的,若“redirect_uri”参数如4.1.1节所述包含在授权请求

  • 在过去的几天里,我一直在玩弄twitter应用编程接口,但似乎无法请求“请求令牌”。(流程A) 在twitterapi上,我应该达到以下终点(https://api.twitter.com/oauth/request_token)如果请求成功,则应向我提供一个,和)(应与我通过的匹配)。我试图只使用我的私钥,但这当然是失败的。我对如何生成此请求的理解是否错误? 我相信我的问题是如何生成。阅读twi

  • 嗨,我正在使用本教程 对于我的twitter测试项目,我已经更改了: 从 =new DefaultOAuthProvider("http://twitter.com/oauth/request_token","http://twitter.com/oauth/access_token","http://twitter.com/oauth/authorize"); 到 =new DefaultOAu