Swagger 使用.NET Core 3.0进行JWT身份验证和炫耀

Swagger 使用.NET Core 3.0进行JWT身份验证和炫耀,swagger,asp.net-core-webapi,swashbuckle,.net-core-3.0,Swagger,Asp.net Core Webapi,Swashbuckle,.net Core 3.0,我正在用.NET Core 3.0开发一些Web API,并希望将其与Swashback.Swagger集成。 它工作得很好,但当我添加JWT身份验证时,它并不像我预期的那样工作。 为此,我添加了以下代码: services.AddSwaggerGen(c=> { c、 SwaggerDoc(“v1”,新的Microsoft.OpenApi.Models.openapinfo{Title=“My Web API”,Version=“v1”}); c、 AddSecurityDefinition(

我正在用.NET Core 3.0开发一些Web API,并希望将其与Swashback.Swagger集成。 它工作得很好,但当我添加JWT身份验证时,它并不像我预期的那样工作。 为此,我添加了以下代码:

services.AddSwaggerGen(c=>
{
c、 SwaggerDoc(“v1”,新的Microsoft.OpenApi.Models.openapinfo{Title=“My Web API”,Version=“v1”});
c、 AddSecurityDefinition(“载体”),新的OpenApiSecurityScheme
{
Description=“使用承载方案的JWT授权头。示例:\“授权:承载{token}\”,
Name=“授权”,
In=参数位置.Header,
类型=SecuritySchemeType.ApiKey
});
});
添加
AddSecurityDefinition
功能后,我可以看到Authorize按钮,当我单击它时,我会看到下面的表单:


然后,我键入
承载器的内容fgdgdgdg845734987fgdhgiher635kjh
。这样做之后,当我从Swagger向Web API发送请求时,我希望在请求头中看到
授权:Bearer whateverapikeyisfgdgdg845734987fgdhgiher635kjh
,但授权没有添加到请求头中。我使用的是Swashback.Swagger(5.0.0-rc3)。请注意,有许多示例在.NET Core 2.0上运行良好,但在最新版本中,虚张声势的虚张声势功能已更改,因此我无法使用这些示例。

经过一些研究,我最终找到了答案

在看到此页面之前,我知道我应该在
AddSecurityDefinition
之后使用
AddSecurityRequirement
,因为有很多示例,但是.NET Core 3.0上的函数参数发生了更改,这是一个问题

顺便说一下,最后的答案如下:

services.AddSwaggerGen(c=>
{
c、 SwaggerDoc(“v1”,新OpenApiInfo{
Title=“我的API”,
Version=“v1”
});
c、 AddSecurityDefinition(“载体”),新的OpenApiSecurityScheme{
In=参数位置.Header,
Description=“请在字段中插入带持票人的JWT”,
Name=“授权”,
类型=SecuritySchemeType.ApiKey
});
c、 AddSecurityRequest(新的OpenAPISecurityRequest{
{ 
新的OpenApiSecurityScheme
{ 
Reference=新的OpenApiReference
{ 
Type=ReferenceType.SecurityScheme,
Id=“持票人”
} 
},
新字符串[]{}
} 
});
});

如果您不想手动添加令牌,并且希望在向identity server传递clientId的同时可以选择作用域,则可以添加类似的内容

我使用了隐式流,但您可以使用以下机制配置任何流:

options.AddSecurityDefinition(“oauth2”,新的OpenApiSecurityScheme())
{
Flows=新的OpenAPIOuthFlows
{
隐式=新的OpenAPIOuthFlow
{                            
AuthorizationUrl=新Uri(“http://localhost"),
TokenUrl=新Uri(“http://localhost"),
范围=新字典
{
{“基础API”、“基础API”}
}
}
},
In=参数位置.Header,
Name=“授权”,
类型=SecuritySchemeType.OAuth2
});
输出如下:


如果您使用的是Swagger 3.0,那么它内置了对JWT身份验证的支持

您需要在OpenApiSecurityScheme中使用ParameterLocation.Header、SecuritySchemeType.Http、bearer和JWT,如下所示

在此之后,将不需要以承载{token}格式指定令牌。仅指定令牌,安全方案将在标头中自动应用它

//承载令牌身份验证
OpenApiSecurityScheme securityDefinition=新的OpenApiSecurityScheme()
{
Name=“持票人”,
BearPerformat=“JWT”,
Scheme=“持票人”,
Description=“指定授权令牌。”,
In=参数位置.Header,
Type=SecuritySchemeType.Http,
};
c、 AddSecurityDefinition(“jwt_auth”,securityDefinition);
//确保swagger UI需要指定的承载令牌
OpenApiSecurityScheme securityScheme=新的OpenApiSecurityScheme()
{
Reference=新的openapirection()
{
Id=“jwt\u auth”,
Type=ReferenceType.SecurityScheme
}
};
OpenApiSecurityRequirement securityRequirements=新的OpenApiSecurityRequirement()
{
{securityScheme,新字符串[]{},
};
c、 添加安全要求(安全要求);

如果有人正在使用NSwag,并在搜索解决方案后登陆此处,请参阅官方文档中的链接


注:我知道最初的问题是针对Swashback的,但谷歌在搜索NSwag时也会首先显示此链接。

这里有一个针对Swashback.AspNetCore 5.3.2的更新解决方案,与IdentityServer4集成,API使用承载令牌进行保护

ConfigureServices()
方法中:

services.AddSwaggerGen(选项=>
{
options.SwaggerDoc(“v1”,新的openapinfo{Title=“myapi”,Version=“v1”});
options.AddSecurityDefinition(“Bearer”,SecuritySchemes.BearerScheme(配置));
options.AddSecurityRequirement(新的OpenApiSecurityRequirement()
{
{SecuritySchemes.OAuthScheme,new List()}
});
});
Configure()
方法中:

app.UseSwaggerUI(选项=>
{
options.SwaggerEndpoint(“/My.Api/swagger/v1/swagger.json”,“My-Api v1”);
options.OAuthClientId(Clients.TestClient);
options.OAuthAppName(“我的Api-Swagger”);
options.OAuthClientSecret(配置[“TestClientSecret”]);
});
内部静态类安全方案
{
公共静态OpenApiSecurityScheme承载模式(IConfiguration config)=>新OpenApiSecurityScheme
{
类型=SecuritySchemeType.OAuth2,
Description=“使用无记名方案的标准授权。示例:\”be