如何在ABP Framework 7.x中为同一client_id设置多个redirect_uri?
如何在OpenIddict中为同一client_id配置多个redirect_uri
OpenIddict完全支持为同一个client_id配置多个有效的redirect_uri,你直接修改数据库表不生效,大概率是因为没走正确的配置流程,或者OpenIddict的缓存没更新导致的。以下是几种可行的操作方式:
1. 通过OpenIddict官方API配置(推荐)
不管是创建新客户端还是更新已有客户端,都应该用OpenIddict提供的OpenIddictApplicationManager来操作,这样能保证配置被正确持久化并同步缓存:
创建新客户端时添加多个redirect_uri
await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor { ClientId = "your-client-id", ClientSecret = "your-client-secret", RedirectUris = { new Uri("https://first-domain.com/callback"), new Uri("https://second-domain.com/callback") }, // 其他必填配置(如授权类型、范围等) });
更新已有客户端的redirect_uri
如果客户端已存在,先找到它再添加新的redirect_uri:
var application = await _applicationManager.FindByClientIdAsync("your-client-id"); if (application != null) { // 添加新的redirect_uri await _applicationManager.AddRedirectUriAsync(application, "https://third-domain.com/callback"); // 保存更改 await _applicationManager.UpdateAsync(application); }
2. 手动修改数据库的正确方式
如果一定要直接操作数据库,注意以下几点:
- 检查
OpenIddictApplications表的RedirectUris字段类型:如果是JSON格式存储(比如PostgreSQL的jsonb、SQL Server的nvarchar),需要把多个URI放在一个JSON数组里,示例值:["https://first-domain.com/callback", "https://second-domain.com/callback"] - 修改后必须清理OpenIddict的缓存:可以直接重启应用,或者调用
_applicationManager.PurgeAsync()方法清除所有应用缓存(注意这个操作会清除所有客户端的缓存,生产环境谨慎使用)。
3. 内存客户端配置方式(适用于开发环境)
如果用的是内存存储客户端,直接在Startup的配置中指定多个redirect_uri即可:
services.AddOpenIddict() .AddCore(options => { options.UseEntityFrameworkCore() .UseDbContext<ApplicationDbContext>(); }) .AddServer(options => { options.AllowAuthorizationCodeFlow() .SetAuthorizationEndpointUris("/connect/authorize") .SetTokenEndpointUris("/connect/token") .UseAspNetCore() .EnableAuthorizationEndpointPassthrough(); }) .AddInMemoryClients(clients => { clients.Add(new OpenIddictApplicationDescriptor { ClientId = "your-client-id", ClientSecret = "your-client-secret", RedirectUris = { new Uri("https://first-domain.com/callback"), new Uri("https://second-domain.com/callback") } }); });
注意事项
- 所有redirect_uri必须是绝对URI(原生应用的自定义URI scheme除外,比如
myapp://callback); - 避免直接手动修改数据库,除非是紧急调试场景,官方API才是最可靠的配置方式。
内容的提问来源于stack exchange,提问作者Cymon Dez
相关产品推荐
相关产品推荐

