在NSwag SwaggerUi中实现JwtBearer身份验证

时间:2017-09-15 09:23:53

标签: asp.net-core jwt azure-active-directory nswag

在我的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的文档。具有两个身份验证工作流程也不太安全。特别是当一个人比另一个人不那么安全时。

4 个答案:

答案 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())。

相关问题