Angular 6和.Net Core 2-生成XSRF令牌,但发送回API时为空

时间:2019-05-13 14:53:57

标签: c# angular asp.net-core

我有一个.net核心2. * API和一个Angular 6. *应用程序,我正在尝试防御XSRF攻击。

登录时,我们获得一个auth令牌,然后再次调用以获取XSRF令牌。

在客户端,我们有一个HTTP拦截器,它将令牌附加到对API的所有后续请求的标头中。

API代码看起来正确,我可以看到响应头包含一个XSRF令牌,但是,一旦对API Request.Headers [“ X-XSRF-TOKEN”]进行后续请求时,是空的。

有人可以告诉我我哪里出了问题吗?

我一直在关注此示例:https://www.blinkingcaret.com/2018/11/29/asp-net-core-web-api-antiforgery/

API控制器

    [ApiController]
    public class AntiForgeryController : Controller
    {
        private IAntiforgery _antiForgery;
        public AntiForgeryController(IAntiforgery antiForgery)
        {
            _antiForgery = antiForgery;
        }

        [Route("api/antiforgery")]
        [IgnoreAntiforgeryToken]
        public IActionResult GenerateAntiForgeryTokens()
        {
            var tokens = _antiForgery.GetAndStoreTokens(HttpContext);
            Response.Cookies.Append("XSRF-REQUEST-TOKEN", tokens.RequestToken, new Microsoft.AspNetCore.Http.CookieOptions
            {
                HttpOnly = false
            });
            return NoContent();
        }
    }

UI服务方法。


      getAntiForgeryToken(): any {
        return this.http.get(`${this.baseURL}/antiforgery`).pipe(map(x => {
          return true;
        }));
      }

UI http拦截器。


    export class AddCsrfHeaderInterceptorService implements HttpInterceptor {
        intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
            let requestToken = this.getCookieValue('XSRF-REQUEST-TOKEN');
            return next.handle(req.clone({
                headers: req.headers.set('X-XSRF-TOKEN', requestToken)
            }));
        }

        private getCookieValue(cookieName: string) {
            const allCookies = decodeURIComponent(document.cookie).split('; ');
            for (let i = 0; i < allCookies.length; i++) {
                const cookie = allCookies[i];
                if (cookie.startsWith(cookieName + '=')) {
                    return cookie.substring(cookieName.length + 1);
                }
            }
            return '';
        }
    }

0 个答案:

没有答案