将自定义 HTTP header 从 oidc-client-js 传递到 IdentityServer 4

Pass custom HTTP header to IdentityServer 4 from oidc-client-js

我正在使用 ASP.NET 核心 WebApi、Javascript 客户端(oidc-client-js)和具有身份的 IdentityServer4 设置解决方案。

我遵循了不同的教程和指南,找到了一个行之有效的解决方案。
在未通过身份验证的情况下访问 JS 客户端时,我被重定向到 IdentityServer,在那里我可以成功登录并使用我的不记名令牌重定向回 JS 客户端,然后我使用它来使用 API。

系统将必须支持多个 "tenants",但它们都共享同一个数据库。 这个想法是使用 URL 中的租户密钥访问 JS 客户端并将其传递: www.mydomain.com/{tenantKey}/someSubPage

我想阅读 tenantKey 并使用像 X-My-Tenant-Key 这样的自定义 HTTP header 将 IdentityServer 传递给它。然后,IdentityServer 应在授权过程中包含此密钥。

我查看了 oidc-client-js' GitHub 页面并做了一些进一步的研究,但是我无法找出它是如何工作的。

另一种方法是将密钥包含在 IdentityServer 的 URL 中并应用一些 MVC 路由魔法,或者以某种方式用 redirect_uri.
做一些肮脏的事情 不过,在尝试任何这些之前,我想看看我是否可能遗漏了一些东西。

这就是我的 JS 客户端原型现在处理它的方式:

// Setup
var config = {
    authority: "http://localhost:50000",
    client_id: "myClient",
    redirect_uri: "http://localhost:65000/callback.html",
    response_type: "id_token token",
    scope: "openid profile email myApi",
    post_logout_redirect_uri: "http://localhost:65000/index.html",
};
var mgr = new Oidc.UserManager(config);

...

// Signing in
mgr.signinRedirect();

不知道这是否是您要查找的内容,但您可以通过 "acr_values" 将租户密钥作为查询参数从您的客户端传递到身份服务器(授权服务器)。这适用于像您这样的情况。您需要将 acr_values 添加到您的客户端:

config = {
authority: "http://localhost:50000",
client_id: "myClient",
redirect_uri: "http://localhost:65000/callback.html",
response_type: "id_token token",
scope: "openid profile email myApi",
post_logout_redirect_uri: "http://localhost:65000/index.html",
acr_values : "tenant:your_tenant" };

然后您可以通过授权上下文访问授权服务器中的值,例如:

string tenant = context.Tenant;

你可以看看docs,它的用途之一就是传递租户信息。