我是斯威格的新人我使用的是OpenAPI 3.0.2。
当我运行Swagger UI时,授权按钮出现在顶部和每个API,但它们不起作用。当我点击它们时,我可以在apiKey框中输入任何文本,它接受它并说我被授权了。但是没有一个API可以工作,它们都返回401
下面是Startup.ConfigureServices中的相关代码
services.AddAuthentication(
x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}
)
.AddJwtBearer(
x =>
{
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false,
ValidateAudience = false,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidIssuer = Configuration["Tokens:Issuer"],
ValidAudience = Configuration["Tokens:Audience"],
};
}
);
services.AddSwaggerGen(
setupAction =>
{
setupAction.SwaggerDoc(
"LibraryOpenApiSpecification",
new Microsoft.OpenApi.Models.OpenApiInfo()
{
Title = "Library API",
Version = "2.0",
Description = "Text",
Contact = new Microsoft.OpenApi.Models.OpenApiContact()
{
Email = "[email protected]",
Name = "user1",
Url = new Uri("http://www.google.com")
}
}
);
setupAction.AddSecurityDefinition(
"Bearer",
new OpenApiSecurityScheme
{
Name = "Authorization",
Type = SecuritySchemeType.ApiKey,
Scheme = "Bearer",
BearerFormat = "JWT",
In = ParameterLocation.Header,
Description = "JWT Authorization header using the Bearer scheme."
}
);
setupAction.AddSecurityRequirement(
new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = "Bearer"
}
},
new string[] { }
}
}
);
var xmlCommentsFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlCommentFullPath = Path.Combine(AppContext.BaseDirectory, xmlCommentsFile);
setupAction.IncludeXmlComments(xmlCommentFullPath);
}
);
代码不是我的,是另一个开发人员带来的。我会提供更多的代码和信息,如果需要的话
3条答案
按热度按时间q43xntqr1#
下面是一个工作示例:
一旦你配置了它,Swagger UI就会给你一个按钮来进行身份验证
一旦您填写输入令牌并发送请求,它就会将其发送到
Authorization
头中。现在,应用程序必须为每个请求解析和验证此令牌,因此您必须在
Startup.Configure
方法中启用auth中间件。然后,如果令牌通过验证,您应该能够访问具有
HttpContext.User
属性的用户。如果您仍然收到401错误,这意味着令牌验证有问题,请检查您是否在
Startup.Configure
方法中配置了授权服务:这将要求所有请求进行身份验证,除非另一个授权策略设置了
[Authorize]
(或[AllowAnonymous]
)属性。这将确保令牌被解析和验证。下面是一个端到端的API,用于对令牌进行签名和验证。
wydwbb8l2#
为了让Swagger UI(.NET 6,OpenApi v3,Swashbuckle v6.5)认证为我工作,我必须创建一个
AuthenticationRequirementsOperationFilter
并将其添加到这个github回答中提到的过滤器中。同样重要的是,关键字bearer
在AddSecurityDefinition
和OpenApiSecurityScheme
中保持相同。下面是示例代码:
Startup.cs
7hiiyaii3#
如果你想使用Type = SecuritySchemeType.ApiKey,那么你需要在关键字Bearer后面加上token,比如'Bearer ',并且token变量的名称应该是Authorization only,或者你可以用Http替换Security Scheme Type,那么你不需要声明任何变量名称,也不需要在传递token时附加bearer。