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

2024-01-04

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

对预检请求的响应未通过访问控制检查:当请求的凭据模式为“include”时,响应中“Access-Control-Allow-Origin”标头的值不得为通配符“*”。 我一直在尝试设置 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 设置为标头。当我的前端与后端位于同一域时,Cookie 在这种情况下运行良好,但现在我也尝试将前端移动到其他服务器和域。

我需要如何配置后端才能从不同域获取cookie?

我的后端在 Azure 上。还有一些 CORS 设置,我删除了 * 并将其替换为特定地址。这和这个有关系吗?

EDIT:

我找到Azure CORS设置后,异常更改为:

对预检请求的响应未通过访问控制检查:响应中“Access-Control-Allow-Credentials”标头的值为“”,当请求的凭据模式为“include”时,该值必须为“true”

EDIT 2:

您需要从 Azure 中删除所有 CORS 设置,才能让 .net core cors 设置获得 cors 控制。仍然没有成功,但也许更接近解决方案。


最后我成功了。正如我在编辑评论中所说,主要原因是 azures CORS 设置。删除它们后,我就可以使用 .net core 设置了。这是我的最终解决方案: 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: true 。

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

对于正在阅读本文并在 azure 中使用 .net Core 并希望使用 CORS 的人,请从 Azure 中删除 CORS 设置并在 .net core 中处理它们,因为在 .net core 中的配置比 azure 中的 CORS 要多得多。以下是我从网上找到的一些内容:

  • https://feedback.azure.com/forums/169385-web-apps/suggestions/32371078-access-control-allow-credentials-not-set-in-creden https://feedback.azure.com/forums/169385-web-apps/suggestions/32371078-access-control-allow-credentials-not-set-in-creden
  • https://github.com/Azure/azure-functions-host/issues/620 https://github.com/Azure/azure-functions-host/issues/620最后一个是有人使用 Azure 函数设置标头的链接,但当我使用 .net core 时,我发现这是非常错误的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何配置.net core以将身份验证cookie发送到不同的域 的相关文章

随机推荐

  • 如何将新的 Orderer 组织添加到现有的 Hyperledger Fabric 网络

    我正在尝试向基于 RAFT 的现有订购服务添加一个新的订购者组织 我正在使用first network from fabric samples作为基础网络 在生成加密材料时 我进行了修改 为另外 1 个订购者组织生成加密材料 这crypto
  • 如何在PyQt5中正确异步加载图像?

    我正在尝试弄清楚如何完成异步图像加载正确地 在 PyQt Qlistview 中 我的主要小部件包括Qlistview and a QLineEdit文本框 我有一个演员数据库 我使用以下子类进行查询QAbstractListModel当在
  • 如何限制计算引擎仅接受来自应用程序引擎的请求

    我正在运行我的服务器Google App engine我在哪里使用nodejs我还有所有其他服务 例如mongoDB Elasticsearch and Redis部署于Compute engine 现在 出于安全考虑 在所有数据库实例 M
  • 如何在 TimePickerAndroid 中为反应本机设置最短日期

    我使用react native创建了一个简单的表单library https github com xgfe react native datepicker与开始时间和结束时间 我问自己为什么我可以在ios上毫无问题地设置开始时间和结束时间
  • 无法使我的 Spring Boot 应用程序与 jsp 一起工作

    我的有问题弹簧靴网络应用程序 它用嵌入式码头 它必须是 jetty 而不是 tomcat 并且它使用jsp意见 但似乎没有办法让嵌入式 jetty 与 jsp 视图一起工作 实际上 当我运行 mu 应用程序服务器时 服务器已成功启动 但是当
  • mysql 酒店客房供应情况

    我在Mysql中有一个可用性表如下 id room id int 11 avail date date 对于每个房间 每个可用日期都有一行 可能存在间隙 例如房间 1 可能有 8 月 1 2 3 5 6 13 14 15 的条目 每隔一天就
  • 如何使用 JSBN 加密 Crypto-JS 密钥?

    我在用着JSBN http www cs students stanford edu tjw jsbn 使用公钥 私钥对加密 解密数据 它非常适合文本数据 包括十六进制字符串 我的问题是现在我有二进制数据 特别是加密JS https cod
  • Oracle 中的有效日期检查

    我有一个以 varchar 格式存储的日期值 有效日期或无效日期 是否可以在sql查询中检查日期是否有效 是的 如果你知道格式并且很少使用 plsql 假设您有格式的日期 yyyy mon dd hh24 mi ss create func
  • IE:indexOf 结果“对象不支持此属性或方法”

    我有以下 if 语句 if buyArray indexOf dealWith 0 1 这是在 ie 即 XP 上的 8 中出现 对象不支持此属性或方法 的情况 有人有解决这个问题的方法吗 是的 IEindexOf 您可以实现如下所示的垫片
  • 具有可用 Eclipse Mylyn 支持的 git 分布式问题跟踪器?

    我在用着git用于版本控制 但我目前缺乏一个好的问题 错误 票证跟踪器与 Eclipse Mylyn 集成 我正在寻找的功能 开源实现 以便我可以添加将来需要的功能 优先使用 GPL LGPL MIT 或 BSD 许可证 分散式 问题mus
  • Azure 表存储异常:409 意外冲突?

    我正在使用 WindowsAzure Storage nuget 包版本 9 0 0 Install Package WindowsAzure Storage Version 9 0 0 以下代码 table CreateIfNotExis
  • 如何在 Django 中加载主干的引导模型

    当主干应用程序加载时 对于我的应用程序来说 这意味着页面已加载 我需要初始收集数据 主干文档说 我不明白这一点 这是否意味着我应该使用初始数据渲染页面 例如 collection initial data 我在后端使用 django 那么如
  • 示例无效的 utf8 字符串?

    我正在测试我的一些代码如何处理错误数据 并且我需要一些无效 UTF 8 的字节序列 你能发布一些 最好能解释一下为什么它们不好 你从哪里得到它们吗 In PHP examples array Valid ASCII gt a Valid 2
  • PhoneGap 还是 JqueryMobile? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我在 PhoneGap Cordova 上构建了应用程序 并在此过程中遇到了很多困难 因此我想我的下一个版本将使用 jQuery Mobile
  • Django 'image' 属性没有与之关联的文件

    当用户注册我的应用程序时 当他到达个人资料页面时 我收到此错误 The image attribute has no file associated with it Exception Type ValueError Error durin
  • VS Code 无法识别 Pi Pico SDK 标头

    所以我已经完成了在 Linux 的 Windows 子系统中编译的所有设置 一切都工作正常 我正在 VS Code 中编写代码 但它无法识别 pico stdlib h 等标头 代码编译并工作正常 但最好能正确设置代码 这样我就可以获得自动
  • JavaScript 对象 ID

    JavaScript 对象 变量是否有某种唯一标识符 就像鲁比那样object id 我指的不是 DOM id 属性 而是某种内存地址 如果您想在不修改底层对象的情况下查找 关联具有唯一标识符的对象 您可以使用WeakMap https d
  • Vanilla Javascript 切换下拉菜单

    我的大脑已经检查过了周末 我正在寻找一种纯 Javascript 解决方案 如果在单击另一个主菜单项时打开一个下拉菜单框 则先前打开的下拉菜单将关闭 然后显示新单击的主菜单项的下拉菜单 我知道这可能很简单 但我无法想出一个不复杂的解决方案
  • 将值从单元格复制到列的其余部分

    有没有人可以帮助我分解这个长公式 并通过检查独立元素来帮助我们理解它是如何工作的 它需要两个连续的列 在本例中为 A 和 B 首先从 A 中获取一个值 如果 A 下方有下一个值 它将重复实际值直到该行 如果 A 中没有剩余值 则返回 空白
  • 如何配置.net core以将身份验证cookie发送到不同的域

    我正在尝试将 cookie 与前端一起使用 该前端的域与后端的域不同 后端是用 net core实现的 前端是Angular 我研究过 在进行 http 调用时需要设置 withCredentials true 但是当我将其设置为 true