SwaggerUI with .NetCore 3.0 bearer token authorization

后端 未结 4 1663
轮回少年
轮回少年 2021-01-02 23:55

I\'m trying to add authorization header into SwaggerUI api test. below is my Startup.cs

public void ConfigureServices(IServiceCollection services)
    {
              


        
相关标签:
4条回答
  • 2021-01-03 00:09

    There are two points in your code:

    1. For OpenApiSecurityRequirement in OpenApiSecurityRequirement, need to set OpenApiReference
    2. Need to specify Scheme with bearer

    Here is a working demo:

    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo
        {
            Version = "v1",
            Title = "API",
            Description = "QPIN API with ASP.NET Core 3.0",
            Contact = new OpenApiContact()
            {
                Name = "Tafsir Dadeh Zarrin",
                Url = new Uri("http://www.tdz.co.ir")
            }
        });
        var securitySchema = new OpenApiSecurityScheme
        {
            Description = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"",
            Name = "Authorization",
            In = ParameterLocation.Header,
            Type = SecuritySchemeType.Http,
            Scheme = "bearer",
            Reference = new OpenApiReference
            {
                Type = ReferenceType.SecurityScheme,
                Id = "Bearer"
            }
        };
        c.AddSecurityDefinition("Bearer", securitySchema);
    
        var securityRequirement = new OpenApiSecurityRequirement();
        securityRequirement.Add(securitySchema, new[] { "Bearer" });
        c.AddSecurityRequirement(securityRequirement);
    });
    
    0 讨论(0)
  • 2021-01-03 00:13

    Note that some parameter's type has been changed since .Net Core 3.0 as follows:

    In = ParameterLocation.Header,

    Type = SecuritySchemeType.ApiKey

    services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
                c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
                {
                    Description = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"",
                    Name = "Authorization",
                    In = ParameterLocation.Header,
                    Type = SecuritySchemeType.ApiKey
                });
            });
    

    Reference: https://ppolyzos.com/2017/10/30/add-jwt-bearer-authorization-to-swagger-and-asp-net-core/

    0 讨论(0)
  • 2021-01-03 00:20

    My implementation - excludes locks on non protected endpoints - with OperationFilter

    internal static void SwaggerSetup(this IServiceCollection services, OpenApiInfo settings)
        {
            if (settings.Version != null)
            {
                services.AddSwaggerGen(c =>
                {
                    c.SwaggerDoc(settings.Version, settings);
                    c.OperationFilter<AddAuthHeaderOperationFilter>();
                    c.AddSecurityDefinition("bearer", new OpenApiSecurityScheme
                    {
                        Description = "`Token only!!!` - without `Bearer_` prefix",
                        Type = SecuritySchemeType.Http,
                        BearerFormat = "JWT",
                        In = ParameterLocation.Header,
                        Scheme = "bearer"
                    });
                });
            }
        }
    

    and the OperationFilter

    private class AddAuthHeaderOperationFilter : IOperationFilter
        {
            public void Apply(OpenApiOperation operation, OperationFilterContext context)
            {
                var isAuthorized = (context.MethodInfo.DeclaringType.GetCustomAttributes(true).OfType<AuthorizeAttribute>().Any()
                                    && !context.MethodInfo.DeclaringType.GetCustomAttributes(true).OfType<AllowAnonymousAttribute>().Any()) //this excludes controllers with AllowAnonymous attribute in case base controller has Authorize attribute
                                    || (context.MethodInfo.GetCustomAttributes(true).OfType<AuthorizeAttribute>().Any()
                                    && !context.MethodInfo.GetCustomAttributes(true).OfType<AllowAnonymousAttribute>().Any()); // this excludes methods with AllowAnonymous attribute
    
                if (!isAuthorized) return;
    
                operation.Responses.TryAdd("401", new OpenApiResponse { Description = "Unauthorized" });
                operation.Responses.TryAdd("403", new OpenApiResponse { Description = "Forbidden" });
    
                var jwtbearerScheme = new OpenApiSecurityScheme
                {
                    Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "bearer" }
                };
    
                operation.Security = new List<OpenApiSecurityRequirement>
                {
                    new OpenApiSecurityRequirement { [jwtbearerScheme] = new string []{} }
                };
            }
        }
    

    Reference https://thecodebuzz.com/jwt-authorize-swagger-using-ioperationfilter-asp-net-core/

    just added the condition to exclude AllowAnonymous decorated methods

    0 讨论(0)
  • 2021-01-03 00:20

    In addition to what Kiril said,in my case I want to get the JWT token through Swagger and this is the code I used, adding the OpenApiSecurityScheme to what he suggested:

    c.AddSecurityDefinition("bearer",
                        new OpenApiSecurityScheme{
                            Flows = new OpenApiOAuthFlows()
                            {
                                ClientCredentials = new OpenApiOAuthFlow()
                                {
                                    TokenUrl = new Uri("https://auth.myauthserver.com/oauth2/token"),
                                    Scopes = new Dictionary<string, string>(){ {"myscope", "Access API"}},
                                    AuthorizationUrl = new Uri("https://auth.myauthserver.com/oauth2/authorize")
                                }
                            }, 
                            Type = SecuritySchemeType.OAuth2,
                            OpenIdConnectUrl = new Uri("https://myauthserver/.well-known/openid-configuration"),
                            BearerFormat = "JWT",
                            In = ParameterLocation.Header,
                            Scheme = "bearer"
                        });
    
    0 讨论(0)
提交回复
热议问题