我正在尝试为我的应用程序实现 Azure AD B2C,并且我想使用 SwaggerUI 进行一些测试。使用 SwaggerUI 和 OAuth2 进行身份验证有效,我登录到 Azure AD B2C,收到多个令牌作为回报。 (我正在使用带有 pkce 的授权代码流程)
{
"id_token": "<valid token>",
"token_type": "Bearer",
"not_before": 1702649151,
"id_token_expires_in": 3600,
"profile_info": "<valid token>",
"scope": "openid",
"refresh_token": "<valid token>",
"refresh_token_expires_in": 86400
}
但是,当我尝试调用我的端点时,它们仍然无法工作。我可以从开发工具中看到它没有在请求中正确发送令牌。它将“授权”标头设置为“承载未定义”。我已经测试了其他类似问题的几个解决方案,但它们不起作用。
这是我当前使用的安全要求:
private static OpenApiSecurityRequirement Oauth2SecurityRequirement =>
new()
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = "oauth2"
},
Scheme = "oauth2",
Name = "oauth2",
In = ParameterLocation.Header
},
new List<string>()
}
};
(是的,我也尝试过以“bearer”作为方案/id的变体,没有区别)
在我的
AddSwaggerGen()
配置中,我有以下内容
c.AddSecurityRequirement(Oauth2SecurityRequirement);
c.OperationFilter<GenericOperationFilter>(Oauth2SecurityRequirement);
其中
c
是 SwaggerGenOptions
对象。
为了完整起见,这是操作过滤器:
public class GenericOperationFilter : IOperationFilter
{
private readonly OpenApiSecurityRequirement _defaultRequirement;
public GenericOperationFilter(OpenApiSecurityRequirement defaultRequirement)
{
_defaultRequirement = defaultRequirement;
}
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
if (context.MethodInfo.GetCustomAttributes(true).OfType<AuthorizeAttribute>().Any())
{
operation.Security = new List<OpenApiSecurityRequirement>
{
//same security requirment defined in AddSecurityRequirement
_defaultRequirement
};
}
}
}
总结一下
(
/utility/claims
只是将用户声明转储到 json 的端点)
您是否在
Program.cs
文件中配置了安全定义?
你应该有这样的东西:
builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo { Title = "API Title", Version = "v1" });
c.AddSecurityDefinition("oauth2", new Microsoft.OpenApi.Models.OpenApiSecurityScheme
{
Description = "Azure AD Login using OAuth2",
Name = "AD Login",
Type = Microsoft.OpenApi.Models.SecuritySchemeType.OAuth2,
Flows = new Microsoft.OpenApi.Models.OpenApiOAuthFlows
{
Implicit = new Microsoft.OpenApi.Models.OpenApiOAuthFlow()
{
AuthorizationUrl = new Uri("https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/authorize"),
TokenUrl = new Uri("https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token"),
Scopes = new Dictionary<string, string>
{
{ "{scope}", "{name}" }
}
}
}
});
c.OperationFilter<AuthRequirementOperationFilter>();
});
此外,您还需要确保将以下内容添加到
app
的
Program.cs
部分
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "API Name");
c.OAuthClientId("{clientId});
c.OAuthUsePkce();
c.OAuthScopeSeparator(" ");
});