5

在我的 asp.net core 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

4 回答 4

6

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也适用于。

于 2018-04-26T10:15:20.977 回答
5

我正在使用 NSwag v13.0.6,并且使用 in 添加 JWT 支持UseSwaggerUi3Startup.Configure根据@Der_Meister 的回答)不再有效。

相反,我发现我必须在AddSwaggerDocument调用中定义设置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");

我的自定义swagger.json包括承载身份验证定义。如果您让 NSwag 生成 Swagger 身份验证定义,那么您的里程可能会有所不同。

于 2019-09-16T18:13:54.100 回答
3

您也可以使用 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();
于 2020-02-06T14:28:12.617 回答
0

Swagger UI 2.x 的 NSwag 设置非常有限。首先,您需要检查 Swagger UI 如何支持这一点,也许您需要自己托管 Swagger UI,以便您可以对其进行更多参数化(并且只需使用 NSwag 生成 Swagger 规范)。

在 NSwag v11.7.2 中,您还可以选择使用 Swagger UI 3.x,也许这个版本 ( UseSwaggerUi3()) 支持开箱即用。

于 2017-09-15T15:38:51.127 回答