【问题标题】:Is it possible to use a single client RedirectUri for multi-tenant application in IdentityServer 4?是否可以在 IdentityServer 4 中将单个客户端 RedirectUri 用于多租户应用程序?
【发布时间】:2018-09-27 02:41:46
【问题描述】:

我有一个使用 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 路径解析为真实路径。

【问题讨论】:

    标签: identityserver4


    【解决方案1】:

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

    为此,您需要创建一个实现IRedirectUriValidator 的类,然后像这样注册它:

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

    这样,您可以在数据库中为客户端设置重定向 URI,使用一些符号来指定 URI 的租户相关部分,然后在运行时使用自定义验证器对其进行检查。

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

    【讨论】:

    • 谢谢雨果。您可以将我定向到的动态重定向 URI 是否存在特定问题或兴趣点?例如,如果我将语法限制为命名令牌,并且该令牌的值只能是有效的租户 ID,这应该可以吗?
    猜你喜欢
    • 2018-01-07
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 2013-12-23
    • 1970-01-01
    • 2021-06-14
    • 2013-06-05
    相关资源
    最近更新 更多