是否可以在IdentityServer 4中使用单个客户端RedirectUri进行多租户应用程序?

时间:2018-04-17 08:07:37

标签: identityserver4

我使用SaasKit进行IdentityServer 4设置,以支持多租户URL路径。这允许我以多租户的方式访问单个IS4实例,如下所示:

https://localhost:5000/tenant/tenant1/.well-known/openid-configuration

IS4实例使用单个数据库进行客户端/范围配置,而不是每个租户使用一个数据库。每个租户只分离用户数据库。

我的问题是客户端只有一个配置,因此有一个RedirectUri和PostLogoutRedirectUri,这些值必须是特定于租户的URL路径,否则回调不会在客户端的租户环境中处理应用

因此,我可以在我的客户端应用程序中指定特定于租户的OpenIdConnectOptions,用于CallbackPath,SignedOutCallbackPath和RemoteSignOutPath的新值,例如:像这样:

options.CallbackPath = $"/tenant/{tenant}{options.CallbackPath}";

但显然这需要将相关的租户片段包含在客户端的配置RedirectUri属性中,否则IS4将使重定向uri无效。

虽然我可以使用来自客户端应用程序的动态clientId,但我不希望在IS4中为每个租户创建特定于租户的客户端配置,并处理管理问题。同样,我不希望将所有可能的特定于租户的重定向URI添加到单个客户端的配置中。

相反,是否可以实现并向IS4注册一些支持以下功能的自定义组件,如果需要,我应该实现哪些接口?

  1. 参数化重定向URI路径,因此可以指定以下内容: https://localhost:5000/tenant/{tenant}/signin-oidc
  2. 当需要重定向时,将参数化的URI路径解析为实际路径。

1 个答案:

答案 0 :(得分:0)

您可以实现自定义重定向URI验证程序。

为此,您需要创建一个实现IRedirectUriValidator的类,然后将其注册为:

services
    .AddIdentityServer(...)
    .AddRedirectUriValidator<MyCustomUriValidator>();

这样,您可以使用某种表示法为数据库中的客户端设置重定向URI,以指定URI的租户相关部分,然后在运行时使用自定义验证器进行检查。

请注意与动态重定向URI相关的危险。