托管 Blazor Webassembly 和非托管 Blazor Webassembly 之间的请求 header 'Referer' 不同
Request header 'Referer' is different between Hosted Blazor Webassembly, and non hosted Blazor Webassembly
我一直在 Blazor Webassembly ASP.NET Core 中开发一个爱好项目,使用模板 Identity Server 实现,并开发了一些授权,它查看来自 Blazor Webassembly 的 API 调用,并使用请求 header 'Referer' 进行授权。
用户对他们参加的一些团队有一些订阅,他们可以在它们之间切换。
URL 具有他们当前所在的团队页面的 Guid,以及当 Blazor Webassembly 对 ASP.NET 核心 Web API 进行 API 调用时,然后它会查看 'Referer' 以找到 Guid。
Here is the request header 'Referer' value as in hosted with ASP.NET Core
'Referer' 值为
https://localhost:5001/Instructor/{some-guid}.
因此,根据 'Referer' 中的 Guid,我可以知道用户正在尝试获取哪个团队的信息。 F.ex。团队成员列表。
这运行良好,但因为我正在迁移到 ASP.NET Core 6,并且想创建一个 JAMStack 设置,所以我移动到一个新的设置,其中包含独立的 Blazor Webassembly 和 ASP.NET Core网络 API 设置。
我有完全相同的授权设置,除了我已经切换到使用 Auth0 而不是 Identityserver (Duende)。
我也在使用 NSwagStudio 为新旧项目的 HTTP 请求创建客户端(并且设置相同)。
我现在的问题是,当我查看请求时 header 'Referer'。我只得到根地址https://localhost:7004/。它不发送 URL.
的其余部分
Here is the request 'Referer' in migrated project, not hosted with ASP.NET Core
我从我的研究中可以看出,'Referer' 可能没有像现在这样使用,因为根本没有关于这个 header 的信息。
有谁知道这是否可能是我切换到 Auth0,或者我应该注意的 .NET 5 和 .NET 6 之间是否有任何变化。
或者可能只是关于我如何控制它的信息。
我这样添加 NSwagClients(使用最新的 NSwag 版本):
string webApiBaseAddress = builder.Configuration["webApiBaseAddress"] ?? string.Empty;
builder.Services.AddTransient<AuthorizationMessageHandler>(sp =>
{
// Get required services from DI.
var provider = sp.GetRequiredService<IAccessTokenProvider>();
var naviManager = sp.GetRequiredService<NavigationManager>();
// Create a new "AuthorizationMessageHandler" instance,
// and return it after configuring it.
var handler = new AuthorizationMessageHandler(provider, naviManager);
handler.ConfigureHandler(authorizedUrls: new[] {
// List up URLs which to be attached access token.
naviManager.ToAbsoluteUri($"{webApiBaseAddress}/api/authorized/").AbsoluteUri
});
return handler;
});
builder.Services.AddHttpClient<ITeamClient, TeamClient>(client =>
client.BaseAddress = new Uri(webApiBaseAddress)).AddHttpMessageHandler<AuthorizationMessageHandler>();
我在这上面花了很多天才弄明白。
问题是 ASP.NET Core Hosted Blazor Webassembly 调用具有相同来源的 API,因此 'Referrer Policy': 'origin-when-cross-origin' 没有限制 'Referer' header.
'origin-when-cross-origin' 是 'Referrer Policy' 的标准,并限制 'Referer' header 用于 cross-origin 调用。
但是当我 运行 它与 Blazor Webassembly 和 ASP.NET Core Web API 各自在他们自己的项目中时,它们是 localhost:7004 和 localhost:7170,被视为 same-site 而不是 same-origin,因此它被限制为仅将 'Origin' 显示为 'Referer' header.
我似乎找不到任何方法让 API 和 Blazor 来自同一个 'Origin',所以我现在通过设置 <meta name="referrer" content="no-referrer-when-downgrade">
在我的 index.html Blazor Webassembly 文件中。
我的应用程序从来没有在 URL 中发送用户敏感信息,并且一切都使用 HTTPS,所以如果 'Referer' 被一个外部来源。
我将寻找一个更好的解决方案来告诉我的 API 调用者试图从哪个团队访问内容,以检查调用者是否在 JWT 中也有访问它的策略,但是对于现在就可以了。
我一直在 Blazor Webassembly ASP.NET Core 中开发一个爱好项目,使用模板 Identity Server 实现,并开发了一些授权,它查看来自 Blazor Webassembly 的 API 调用,并使用请求 header 'Referer' 进行授权。
用户对他们参加的一些团队有一些订阅,他们可以在它们之间切换。
URL 具有他们当前所在的团队页面的 Guid,以及当 Blazor Webassembly 对 ASP.NET 核心 Web API 进行 API 调用时,然后它会查看 'Referer' 以找到 Guid。
Here is the request header 'Referer' value as in hosted with ASP.NET Core
'Referer' 值为
https://localhost:5001/Instructor/{some-guid}.
因此,根据 'Referer' 中的 Guid,我可以知道用户正在尝试获取哪个团队的信息。 F.ex。团队成员列表。
这运行良好,但因为我正在迁移到 ASP.NET Core 6,并且想创建一个 JAMStack 设置,所以我移动到一个新的设置,其中包含独立的 Blazor Webassembly 和 ASP.NET Core网络 API 设置。
我有完全相同的授权设置,除了我已经切换到使用 Auth0 而不是 Identityserver (Duende)。
我也在使用 NSwagStudio 为新旧项目的 HTTP 请求创建客户端(并且设置相同)。
我现在的问题是,当我查看请求时 header 'Referer'。我只得到根地址https://localhost:7004/。它不发送 URL.
的其余部分Here is the request 'Referer' in migrated project, not hosted with ASP.NET Core
我从我的研究中可以看出,'Referer' 可能没有像现在这样使用,因为根本没有关于这个 header 的信息。
有谁知道这是否可能是我切换到 Auth0,或者我应该注意的 .NET 5 和 .NET 6 之间是否有任何变化。
或者可能只是关于我如何控制它的信息。
我这样添加 NSwagClients(使用最新的 NSwag 版本):
string webApiBaseAddress = builder.Configuration["webApiBaseAddress"] ?? string.Empty;
builder.Services.AddTransient<AuthorizationMessageHandler>(sp =>
{
// Get required services from DI.
var provider = sp.GetRequiredService<IAccessTokenProvider>();
var naviManager = sp.GetRequiredService<NavigationManager>();
// Create a new "AuthorizationMessageHandler" instance,
// and return it after configuring it.
var handler = new AuthorizationMessageHandler(provider, naviManager);
handler.ConfigureHandler(authorizedUrls: new[] {
// List up URLs which to be attached access token.
naviManager.ToAbsoluteUri($"{webApiBaseAddress}/api/authorized/").AbsoluteUri
});
return handler;
});
builder.Services.AddHttpClient<ITeamClient, TeamClient>(client =>
client.BaseAddress = new Uri(webApiBaseAddress)).AddHttpMessageHandler<AuthorizationMessageHandler>();
我在这上面花了很多天才弄明白。
问题是 ASP.NET Core Hosted Blazor Webassembly 调用具有相同来源的 API,因此 'Referrer Policy': 'origin-when-cross-origin' 没有限制 'Referer' header.
'origin-when-cross-origin' 是 'Referrer Policy' 的标准,并限制 'Referer' header 用于 cross-origin 调用。
但是当我 运行 它与 Blazor Webassembly 和 ASP.NET Core Web API 各自在他们自己的项目中时,它们是 localhost:7004 和 localhost:7170,被视为 same-site 而不是 same-origin,因此它被限制为仅将 'Origin' 显示为 'Referer' header.
我似乎找不到任何方法让 API 和 Blazor 来自同一个 'Origin',所以我现在通过设置 <meta name="referrer" content="no-referrer-when-downgrade">
在我的 index.html Blazor Webassembly 文件中。
我的应用程序从来没有在 URL 中发送用户敏感信息,并且一切都使用 HTTPS,所以如果 'Referer' 被一个外部来源。
我将寻找一个更好的解决方案来告诉我的 API 调用者试图从哪个团队访问内容,以检查调用者是否在 JWT 中也有访问它的策略,但是对于现在就可以了。