在Azure中部署时未在Cookie中设置防伪令牌

时间:2018-12-12 05:22:58

标签: angular azure cookies asp.net-core antiforgerytoken

我有两个应用程序服务,一个是角度应用程序,另一个是.NET Core 2.0应用程序。我从后者创建Antiforgery令牌,并将其附加到每个请求的标头,以便在前一个请求中将其设置为cookie。

Startup.cs

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors();
        services.AddAntiforgery(options =>
        {
            options.HeaderName = "X-XSRF-TOKEN";
            options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
            options.Cookie.HttpOnly = false;
            options.Cookie.SameSite = SameSiteMode.None;

        });
        ...

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseCookiePolicy(new CookiePolicyOptions
        {
            MinimumSameSitePolicy = SameSiteMode.None
        });

        app.UseAntiforgeryTokenMiddleware("X-XSRF-TOKEN");
        ....

AntiForgeryMiddleware.cs

    public async Task Invoke(HttpContext context, IAntiforgery antiforgery, ILogger<AntiForgeryMiddleware> logger)
    {
        string path = context.Request.Path.Value;
        if (path != null && path.ToLower().Contains("/api/account/authorizeview"))
        {
            if (httpVerbs.Contains(context.Request.Method, StringComparer.OrdinalIgnoreCase))
            {
                var tokens = antiforgery.GetAndStoreTokens(context);

                context.Response.Cookies.Append(requestTokenCookieName, tokens.RequestToken, new CookieOptions()
                {
                    HttpOnly = false, 
                    Secure = true
                });
            } 
        }
        context.Response.Headers.Add("Access-Control-Allow-Credentials", "true");

        await next.Invoke(context);
    }

在Angular应用中设置了withCredentials: true。 这在localhost中有效,但在Chrome中未设置当部署到Azure饼干时。在Microsoft Edge中,cookies作为屏幕快照显示在响应中,但不显示在应用程序存储中。

enter image description here

1 个答案:

答案 0 :(得分:1)

我们不能从顶级域名为azurewebsites.net的子域访问cookie,因为它已在公共前缀列表中列出。

更多详细信息:ASP.NET5, MVC 6 Cookies not being shared across sites