在我的asp.net核心2.0解决方案中,我想添加Azure AD身份验证。使用VS 2017中的Azure AD模板,您可以获得JWTBearer身份验证实现或OpenIdConnect实现。 Open Id也比OAuth更安全。
如何将Open ID / JWT与NSwag提供的Swagger Ui一起使用?
我目前的解决方法是允许OAuth和Open Id,但我需要自己实现,并且几乎没有关于新2.0 API的文档。具有两个身份验证工作流程也不太安全。特别是当一个人比另一个人不那么安全时。
答案 0 :(得分:4)
Sample renepape :
app.UseSwaggerUi(typeof(Startup).GetTypeInfo().Assembly, settings =>
{
settings.GeneratorSettings.OperationProcessors.Add(new OperationSecurityScopeProcessor("JWT Token"));
settings.GeneratorSettings.DocumentProcessors.Add(new SecurityDefinitionAppender("JWT Token",
new SwaggerSecurityScheme
{
Type = SwaggerSecuritySchemeType.ApiKey,
Name = "Authorization",
Description = "Copy 'Bearer ' + valid JWT token into field",
In = SwaggerSecurityApiKeyLocation.Header
}));
});
它也适用于UseSwaggerUi3
。
答案 1 :(得分:2)
您也可以使用config.AddSecurity,它似乎为此而设计:
services.AddSwaggerDocument(config => {
config.AddSecurity("JWT token", new OpenApiSecurityScheme
{
Type = OpenApiSecuritySchemeType.ApiKey,
Name = "Authorization",
Description = "Copy 'Bearer ' + valid JWT token into field",
In = OpenApiSecurityApiKeyLocation.Header
});
config.PostProcess = (document) =>
{
document.Info.Version = "v1";
document.Info.Title = "MyRest-API";
document.Info.Description = "ASP.NET Core 3.1 MyRest-API";
};
});
但是,两种构造都导致可以在Swagger UI中添加令牌的选项,但没有导致发送Authorization标头。当我添加以下行时:
config.OperationProcessors.Add(new OperationSecurityScopeProcessor("JWT token"));
有效。 ConfigureServices中的完整代码:
services.AddSwaggerDocument(config => {
config.OperationProcessors.Add(new OperationSecurityScopeProcessor("JWT token"));
config.AddSecurity("JWT token", new OpenApiSecurityScheme
{
Type = OpenApiSecuritySchemeType.ApiKey,
Name = "Authorization",
Description = "Copy 'Bearer ' + valid JWT token into field",
In = OpenApiSecurityApiKeyLocation.Header
});
config.PostProcess = (document) =>
{
document.Info.Version = "v1";
document.Info.Title = "MyRest-API";
document.Info.Description = "ASP.NET Core 3.1 MyRest-API";
};
});
然后在“配置”中
app.UseOpenApi();
app.UseSwaggerUi3();
答案 2 :(得分:1)
我正在使用NSwag v13.0.6,并且在UseSwaggerUi3
中添加Startup.Configure
的JWT支持(根据@Der_Meister的回答)不再有效。
相反,我发现我必须在AddSwaggerDocument
的{{1}}调用中定义设置:
Startup.ConfigureServices
注意:
// In the ConfigureServices method -- FWIW my app has this right after services.AddMvc()
services.AddSwaggerDocument(config => {
config.DocumentProcessors.Add(new SecurityDefinitionAppender("JWT Token",
new OpenApiSecurityScheme {
Type = OpenApiSecuritySchemeType.ApiKey,
Name = "Authorization",
Description = "Copy 'Bearer ' + valid JWT token into field",
In = OpenApiSecurityApiKeyLocation.Header
}));
});
来解决using NSwag.Generation.Processors.Security
SecurityDefinitionAppender
来解析然后在using NSwag
中,您需要的是这个
Startup.Configure
实际上,我在app.UseSwaggerUi3();
中的工作代码与上面的代码略有不同,因为我使用了自定义Startup.Configure
(这是项目要求):
swagger.json
我的自定义// Required for serving up a static, hand-rolled JSON file for Swagger doc.
app.UseStaticFiles();
// Specify the custom JSON location.
app.UseSwaggerUi3(settings => settings.DocumentPath = "/swagger/v1/swagger.json");
包含Bearer Authentication定义。如果您要让NSwag生成Swagger身份验证定义,那么您的里程可能会有所不同。
答案 3 :(得分:0)
Swagger UI 2.x的NSwag设置非常有限。首先,您需要检查Swagger UI如何支持这一点,也许您需要自己托管Swagger UI,以便您可以更多地进行参数化(并且只需使用NSwag生成Swagger规范)。
在NSwag v11.7.2中,您还可以选择使用Swagger UI 3.x,也许这个版本支持开箱即用(UseSwaggerUi3()
)。