配置Swagger UI 10.1.7发送Bearer Token头及授权数据存储咨询
从.NET 8迁移到.NET 10后Swashbuckle.AspNetCore 10.1.7授权问题排查与配置需求
背景
我们在从.NET 8迁移到.NET 10的过程中,将项目的Swashbuckle.AspNetCore从6.6.2版本升级到了10.1.7版本,但新版本的Swagger UI出现了严重的授权问题。
迁移前的认证/授权配置
1. OAuth2隐式授权方案
我们使用隐式流登录并获取access token,身份提供商配置代码如下:
public static AuthenticationBuilder AddAuthenticationForClientPortalApi( this IServiceCollection services, AuthorityConfig authorityConfig, Action<IdentityServerAuthenticationOptions> configureOptions = null) { if (services == null) throw new ArgumentNullException(nameof(services)); return services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme) .AddIdentityServerAuthentication(options => { options.Authority = authorityConfig.BaseUrl; options.ApiName = authorityConfig.ApiName; configureOptions?.Invoke(options); }); }
同时添加了oauth2安全定义,通过身份提供商登录页面提交凭证获取access token:
return services.AddTransient<IConfigureOptions<SwaggerGenOptions>, TSwaggerConfig>() .AddSwaggerGen(options => { options.DescribeAllParametersInCamelCase(); options.OperationFilter<SwaggerDefaultValuesFilter>(); options.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme { Type = SecuritySchemeType.OAuth2, Flows = authFlow == AuthFlowType.Implicit ? new OpenApiOAuthFlows() { Implicit = new OpenApiOAuthFlow() { AuthorizationUrl = new Uri(authorityConfig?.AuthorizationUrl), Scopes = scopes } } : new OpenApiOAuthFlows() { ClientCredentials = new OpenApiOAuthFlow() { TokenUrl = new Uri(authorityConfig?.AuthorizationUrl), Scopes = scopes } } }); options.OperationFilter<TAuthFilter>(); options.EnableAnnotations(); if (maskSchemas) { options.CustomSchemaIds(type => Convert.ToBase64String(Encoding.UTF8.GetBytes(type?.FullName.ToSha256() ?? "")) .Trim('=')); } });
2. Swagger UI登录流程
该配置支持通过Swagger UI的Authorize按钮登录,自动重定向到身份提供商的登录页面。
3. 请求执行
执行授权端点请求时,会自动插入带Bearer access token的Authorization Header。
迁移后的问题
迁移到最新Swashbuckle.AspNetCore包(仅调整命名空间)后,执行API请求时仅发送cookie,缺失带Bearer token的Authorization Header。
需求与疑问
- 如何配置Swagger UI 10.x.x,在保持OAuth2隐式流登录的同时,让请求同时发送Bearer token的
AuthorizationHeader和cookie? - Swagger UI 10.x.x在初次登录/解锁API页面后,授权数据存储在何处?
当前项目引用的包:
<PackageReference Include="Microsoft.OpenApi" Version="2.4.1" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="10.1.7" />
已搜索相关问题,但未找到针对.NET 10和Swashbuckle.AspNetCore 10.1.7的解决方案,旧版本的workaround不适用。
内容的提问来源于stack exchange,提问作者Anton Kovachev
相关产品推荐
相关产品推荐

