如何为.NET 5 Web API配置Swagger通过用户名密码生成Bearer令牌
解决方案说明
你当前使用的SecuritySchemeType.ApiKey类型的安全定义仅支持手动填写已生成的JWT令牌,无法触发用户名、密码输入弹窗。要实现输入账号密码自动获取Azure AD颁发的Bearer令牌,需要将Swagger安全配置调整为OAuth2 资源所有者密码凭证(ROPC)流模式,具体修改步骤如下:
步骤1:修改Program.cs/Startup.cs中的SwaggerGen配置
替换你原来的AddSwaggerGen代码为以下配置,注意替换配置中的Azure AD相关参数为你自己的实际值:
services.AddSwaggerGen(c => { c.SwaggerDoc("v2", new OpenApiInfo { Title = "APIs", Version = "v2" }); // 替换为OAuth2密码流安全定义 c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { Type = SecuritySchemeType.OAuth2, Flows = new OpenApiOAuthFlows { Password = new OpenApiOAuthFlow { // 替换{你的AAD租户ID}为实际租户ID TokenUrl = new Uri("https://login.microsoftonline.com/{你的AAD租户ID}/oauth2/v2.0/token"), // 替换为你API暴露的scope,例如:api://xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/Access.All Scopes = new Dictionary<string, string> { { "你的API自定义Scope", "访问API的权限" } } } }, Description = "使用Azure AD账号密码获取Bearer令牌进行身份校验", Name = "Authorization", In = ParameterLocation.Header }); c.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Id = "Bearer", Type = ReferenceType.SecurityScheme } }, // 这里要和上面定义的Scope保持一致 new List<string> { "你的API自定义Scope" } } }); });
步骤2:配置Swagger UI的OAuth参数
在HTTP请求管道配置的UseSwaggerUI部分添加OAuth相关配置:
app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v2/swagger.json", "APIs v2"); // 替换为你AAD应用注册的客户端ID c.OAuthClientId("你的AAD应用客户端ID"); // 如果你的AAD应用是机密客户端,填写客户端密钥,公开客户端可省略 c.OAuthClientSecret("你的AAD应用客户端密钥(可选)"); c.OAuthUseBasicAuthenticationWithAccessCodeGrant(); c.OAuthScopeSeparator(" "); });
步骤3:确认Azure AD应用注册配置
要确保ROPC流能正常工作,需要在Azure门户的应用注册中做如下配置:
- 进入「身份验证」选项卡,在「高级设置」中开启「允许公共客户端流」
- 进入「API权限」选项卡,添加你自己暴露的API权限并授予管理员同意
- 确保你用于测试的用户账号没有启用MFA(多因素认证),否则ROPC流会校验失败
注意事项
- 资源所有者密码凭证(ROPC)流仅建议在开发测试环境使用,生产环境请使用更安全的OAuth2授权码流
- 配置完成后启动项目,点击Swagger页面右上角的
Authorize按钮即可看到用户名、密码输入框,填写完成后会自动获取令牌并附加到后续接口请求的Header中
内容的提问来源于stack exchange,提问作者K.Z
相关产品推荐
相关产品推荐

