API Cookie问题-尝试在angular中创建XSRF / CSRF令牌

时间:2018-12-08 00:52:17

标签: angularjs cookies csrf

我的用于初始化会话的Web API方法成功返回了cookie。前端是角形的,所以我将cookie称为XSRF-TOKEN,因为angular表示会接受它,并在所有后续请求中将其转换为名为X-XSRF-TOKEN的标头。

作为参考,用于创建cookie的Web API GET控制器方法

        ...
        HttpResponseMessage resp = new HttpResponseMessage() {
            Content = new JsonContent(results)
        };
        if (results.Token != null) {
            var cookie = new CookieHeaderValue("XSRF-TOKEN", results.Token);
            cookie.Expires = DateTimeOffset.Now.AddDays(365);
            cookie.Domain = Request.RequestUri.Host;
            cookie.Path = "/";
            cookie.HttpOnly = false;
            resp.Headers.AddCookies(new CookieHeaderValue[] { cookie });
        }
        return resp;
        ...

使用Fiddler,我可以在响应中看到cookie。现在我期待两件事

  1. 对同一域的所有后续API调用都应在请求标头中包含此cookie
  2. Angular应该添加我前面提到的X-XSRF-TOKEN标头

都没有发生(我正在与Fiddler确认)。我已经在同一域(例如localhost)和不同域中尝试了该站点和API。

我检查过的一些来源:

我也尝试添加

$httpProvider.xsrfWhitelistedOrigins = [webServicesPath];

其中webServicesPath是我用于API路径的变量,但没有区别。

1 个答案:

答案 0 :(得分:0)

您应该使用类似以下的方式

public void Configure(IApplicationBuilder app, IAntiforgery antiforgery) {

    context.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken, new CookieOptions() { HttpOnly = false });

}

public void ConfigureServices(IServiceCollection services) {

    // Angular's default header name for sending the XSRF token.
    services.AddAntiforgery(options => options.HeaderName = "X-XSRF-TOKEN");    
}