首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有角4的.NET核心API - cookie令牌和请求令牌被交换。

问具有角4的.NET核心API - cookie令牌和请求令牌被交换。
EN

Stack Overflow用户
提问于 2018-03-21 15:47:49
回答 1查看 1.4K关注 0票数 4

当我试图用.NET内核实现XSRF时,我一直收到这样的消息:“对提供的防伪令牌的验证失败了。cookie令牌和请求令牌被交换了。”我在角和API中配置了相同的cookie和标头名称。有人有什么想法吗?

过程

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

代码语言:javascript
复制
    [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
            });
    }

然后角截取下一个POST请求,并略为重写默认的XSRF处理,因为我需要它来处理HTTPS URL。

代码语言:javascript
复制
    // 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);
    }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-21 08:19:45

我遇到了同样的问题,我想我发现了这个问题。options.Cookie.Name在AddAntiforgery 中必须与使用context.Response.Cookies.Append手动设置的cookie不同。

试着改变其中一个的名字,它就能工作了。现在,您将覆盖生成的cookie,该cookie使用options.Cookie.Name名称和tokens.RequestToken值。

您可以注意到开发工具的不同之处。

  • 使用options.Cookie.Name生成的默认令牌被标记为http only (HttpOnly = true)
  • 使用context.Response.Cookies.Append手动附加的令牌标记为HttpOnly = false。

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49410813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档