如何在IdentityServer4的.well-known配置中移除offline_access作用域
移除IdentityServer4元数据中的offline_access条目
下面提供两种可行的解决方法,按需选择:
方法一:通过自定义Discovery配置覆盖字段
在配置IdentityServer的代码中(.NET 6+在Program.cs,旧版本在Startup.cs的ConfigureServices),添加自定义逻辑过滤掉offline_access:
services.AddIdentityServer() // 保留你原有的配置,比如AddInMemoryApiScopes、AddInMemoryClients等 .Configure<IdentityServerOptions>(options => { // 自定义scopes_supported字段,覆盖默认值 options.Discovery.CustomEntries.Add("scopes_supported", () => { var allScopes = options.Discovery.GetScopeNames(); // 过滤掉offline_access return allScopes.Where(scope => scope != "offline_access").ToList(); }); });
方法二:自定义Discovery响应生成器
这种方式更灵活,适合需要对元数据做更多自定义修改的场景:
- 创建自定义的响应生成器类:
public class CustomDiscoveryResponseGenerator : DefaultDiscoveryResponseGenerator { public CustomDiscoveryResponseGenerator( IScopeRepository scopeRepository, ILogger<DefaultDiscoveryResponseGenerator> logger, IdentityServerOptions options, IResourceStore resourceStore) : base(scopeRepository, logger, options, resourceStore) { } public override async Task<DiscoveryDocumentResponse> GenerateAsync(string baseUrl, string issuerUri = null) { // 先获取默认生成的元数据响应 var response = await base.GenerateAsync(baseUrl, issuerUri); // 移除scopes_supported中的offline_access response.ScopesSupported?.Remove("offline_access"); return response; } }
- 在IdentityServer配置中替换默认的生成器:
services.AddIdentityServer() // 保留你原有的配置 .AddDiscoveryResponseGenerator<CustomDiscoveryResponseGenerator>();
注意:以上操作仅隐藏元数据中的offline_access条目。如果需要完全禁止客户端请求该权限,还需确保所有客户端配置中未启用AllowOfflineAccess,且资源配置中不包含该scope。
内容的提问来源于stack exchange,提问作者K V
相关产品推荐
相关产品推荐

