如何配置.net核心以将身份验证cookie发送到不同的域

时间:2018-03-11 10:14:37

标签: angular azure cookies cors .net-core

我正在尝试使用前端域名与后端域名不同的Cookie。后端使用.net核心实现,前端是Angular。 我研究过我需要设置withCredentials:在进行http调用时为true。但当我将其设置为true时,我收到此错误:

  

对预检请求的响应未通过访问控制检查:' Access-Control-Allow-Origin'响应中的标题不能是通配符' *'当请求的凭据模式为' include'时。   我一直在尝试设置CORS和Cookie设置以适应这种情况。这是我在StartUp.cs中的相关代码。   科尔斯设置:

services.AddCors(options =>
        {
            options.AddPolicy("AllowDomainOrigin",
                builder =>
                {
                    builder
                        .WithOrigins("http://some.domain.net")
                        .AllowAnyHeader()
                        .AllowAnyMethod();
                });
            options.AddPolicy("AllowForLocalhost",
                builder =>
                {
                    builder
                        .WithOrigins("http://localhost:4200")
                        .AllowAnyHeader()
                        .AllowAnyMethod()
                        .AllowCredentials();
                });
        });
services.AddSession(options =>
        {
            options.Cookie.SameSite = SameSiteMode.None;
        });
...
        app.UseCors("AllowDomainOrigin");
        app.UseCors("AllowForLocalhost");

Cookie设置:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => 
            {
                options.Cookie.Domain = "some.domain.net";
                options.Cookie.Name = "access_token";
                options.Cookie.SameSite = SameSiteMode.None;
                options.LoginPath = "/login";
                options.LogoutPath = "/login";
            })
            .AddCookie("localhost", options => 
            {
                options.Cookie.Domain = "localhost";
                options.Cookie.Name = "localhost_access_token";
                options.Cookie.SameSite = SameSiteMode.None;
                options.LoginPath = "/login";
                options.LogoutPath = "/login";
            })
            .AddCookie("othercloud", options => 
            {
                options.Cookie.Domain = "domain.com";
                options.Cookie.Name = "musiple_access_token";
                options.Cookie.SameSite = SameSiteMode.None;
                options.LoginPath = "/login";
                options.LogoutPath = "/login";
            })
            .AddJwtBearer(options => 
            {
                options.TokenValidationParameters = tokenValidationParameters;
            });

以下是我在登录控制器中登录HttpContext的方法:

await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
await HttpContext.SignOutAsync("localhost");
await HttpContext.SignOutAsync("othercloud");
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
            new ClaimsPrincipal(identity),
            authProperties);
await HttpContext.SignInAsync("localhost",
            new ClaimsPrincipal(identity),
            authProperties);
await HttpContext.SignInAsync("othercloud",
            new ClaimsPrincipal(identity),
            authProperties);

这是我的音频文件端点:

[HttpGet("{id}")]
[Authorize(AuthenticationSchemes= CookieAuthenticationDefaults.AuthenticationScheme +", localhost, othercloud")]
public async Task<FileStreamResult> Get(int id)

因此,您看到我也使用JWT令牌进行身份验证。我需要cookie,因为我使用音频元素从我的REST API下载mp3文件,并且我将音频元素src直接设置为我的REST API地址。因此,在使用音频元素时,我无法将JWT设置为标题。当我的前端与后端处于同一域时,Cookies在这种情况下运行良好,但现在我也尝试将前端移动到其他服务器和域。

如何配置后端以获取来自不同域的cookie?

我的后端在Azure上。还有一些CORS设置,我删除*并用特定地址替换它。这与此有关吗?

编辑:

找到Azure CORS设置后,Exception更改为:

  
    

对预检请求的响应没有通过访问控制检查:“访问控制 - 允许 - 凭证”的值是&#39;回复中的标题是&#39;&#39;哪一定是真的&#39;当请求的凭据模式为“包括”

时   

编辑2:

您需要从Azure中删除所有CORS设置,以获取您的.net核心角色设置以获得cors控制权。仍然没有成功,但可能更接近解决方案。

1 个答案:

答案 0 :(得分:0)

最后我开始工作了。正如我在编辑评论中所说,主要原因是azures CORS设置。删除它们后,我将获得我的.net核心设置。这是我的最终解决方案: Cookie设置:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => 
            {
                options.Cookie.Name = "access_token";
                options.Cookie.SameSite = SameSiteMode.None;
            })
            .AddJwtBearer(options => 
            {
                options.TokenValidationParameters = tokenValidationParameters;
            });

CORS设置:

services.AddCors(options =>
        {
            options.AddPolicy("AllowAllOrigins",
                builder =>
                {
                    builder
                        .AllowAnyOrigin()
                        .AllowAnyHeader()
                        .AllowAnyMethod()
                        .AllowCredentials();
                });
        });
...

app.UseCors("AllowAllOrigins");

以下是登录后端的相关代码:

await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);

await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
            new ClaimsPrincipal(identity),
            authProperties);

这在我的音频控制器端点

就足够了
[HttpGet("{id}")]
[Authorize()]
public async Task<FileStreamResult> Get(int id)

在前端,我设置了withCredentials:当我进行登录呼叫时为真。

现在,当我使用AllowAnyOrigin而不是WithOrigin时,这是非常不安全的,但由于某种原因,我没有使用WithOrigin。

对于那些正在阅读本文且正在使用.net Core并希望使用CORS的人来说,从Azure中删除你的CORS设置并在.net核心中处理它们,因为在.net核心中,配置比在天蓝色的CORS中要多得多。以下是我从互联网上找到的一些内容: