在针对 Azure AD B2C 进行授权后,如何让 SwaggerUI/Swashbuckle 将正确的令牌发送到我的 API?

问题描述 投票:0回答:1

我正在尝试为我的应用程序实现 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
            };
        }
    }
}

总结一下

  • 针对 Azure AD B2C 进行身份验证有效,我得到了几个令牌
  • 我在“授权”按钮和 SwaggerUI 的端点上都看到了小锁图标
  • 当我尝试执行端点时,它不会发送授权标头中的令牌。

/utility/claims
只是将用户声明转储到 json 的端点)

asp.net swagger azure-ad-b2c
1个回答
0
投票

您是否在

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(" ");
    });
© www.soinside.com 2019 - 2024. All rights reserved.