我正在尝试使用前端域名与后端域名不同的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控制权。仍然没有成功,但可能更接近解决方案。
答案 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中要多得多。以下是我从互联网上找到的一些内容: