注册多个 RedirectUris

Register multiple RedirectUris

有时一个客户端有多个重定向 uri。我们希望能够注册多个 RedirectUri 值。如果有的话,我们怎么做?

context.Applications.Add(new OpenIddictApplication
{
    ClientId = "zamboni-app",
    ClientSecret = Crypto.HashPassword("secret_secret_secret"),
    DisplayName = "Zamboni app",
    LogoutRedirectUri = "http://zamboni-app.azurewebsites.net/signout-oidc",
    RedirectUri = "http://zamboni-app.azurewebsites.net/signin-oidc",
    Type = OpenIddictConstants.ClientTypes.Public
});

编辑: 对多个 redirect_uri 的支持已添加到 OpenIddict 的 RTM 版本中。我最初的建议仍然适用:请不要使用此功能来创建跨越多个 domains/security 边界的“大型客户”。


OpenIddict 故意不支持指定多个 redirect_uri,以阻止您为所有应用重复使用相同的客户端注册(阅读 client_id)。

当需要从多个域访问客户端应用程序时,我也有此要求(这是大多数 OAuth 提供商允许这样做的原因)。

您可以通过创建从 OpenIddictApplicationManager<TApplication> 派生的新 class 并覆盖 ValidateRedirectUriAsync 方法来允许客户端应用程序使用多个重定向 URI:

public sealed class MyApplicationManager : OpenIddictApplicationManager<MyApplication>
{
    /// <inheritdoc />
    public override Task<bool> ValidateRedirectUriAsync(MyApplication application, string address, CancellationToken cancellationToken)
    {
        var validRedirectUris = application.RedirectUris.Select(u => u.Uri);
        if(validRedirectUris.Contains(address, StringComparer.Ordinal))
            return Task.FromResult(true);
        return Task.FromResult(false);
    }
}

在此示例中,MyApplication 有一个包含重定向 URI 的附加字段,这可能是与数据库中另一个实体的关系。

然后一定要像这样注册这个应用程序管理器:

services.AddOpenIddict<MyApplication, OpenIdAuthorization, OpenIdScope, OpenIdToken>()
    .AddApplicationManager<MyApplicationManager>();