diff --git a/src/SharedKernel/OpenApi/OpenApiOptionsExtensions.cs b/src/SharedKernel/OpenApi/OpenApiOptionsExtensions.cs index 393ba6b..cdf5eaa 100644 --- a/src/SharedKernel/OpenApi/OpenApiOptionsExtensions.cs +++ b/src/SharedKernel/OpenApi/OpenApiOptionsExtensions.cs @@ -30,42 +30,38 @@ internal OpenApiOptions AddDocument(Document doc, OpenApiConfig openApiConfig) return options; } - + internal OpenApiOptions UseApiSecuritySchemes(OpenApiConfig? config) { - if (config?.SecuritySchemes is not { Count: > 0 }) - { - return options; - } + if (config?.SecuritySchemes is not { Count: > 0 }) { return options; } options.AddDocumentTransformer((document, _, _) => { document.Components ??= new OpenApiComponents(); - document.Components.SecuritySchemes ??= new Dictionary(StringComparer.Ordinal); + document.Components.SecuritySchemes ??= + new Dictionary(StringComparer.Ordinal); + + document.Security ??= new List(); + document.Security.Clear(); - foreach (var scheme in config.SecuritySchemes) + foreach (var s in config.SecuritySchemes) { - document.Components.SecuritySchemes[scheme.HeaderName] = new OpenApiSecurityScheme + // Strongly recommended: separate ID from header name. + // If you can't change config now, keep s.HeaderName as the ID. + var schemeId = s.HeaderName; + + document.Components.SecuritySchemes[schemeId] = new OpenApiSecurityScheme { Type = SecuritySchemeType.ApiKey, In = ParameterLocation.Header, - Name = scheme.HeaderName, - Description = scheme.Description + Name = s.HeaderName, + Description = s.Description }; - } - - return Task.CompletedTask; - }); - - options.AddOperationTransformer((operation, _, _) => - { - operation.Security ??= new List(); - foreach (var scheme in config.SecuritySchemes) - { - operation.Security.Add(new OpenApiSecurityRequirement + // IMPORTANT: reference must be created with document context + document.Security.Add(new OpenApiSecurityRequirement { - [new OpenApiSecuritySchemeReference(scheme.HeaderName)] = [] + [new OpenApiSecuritySchemeReference(schemeId, document)] = [] }); } @@ -74,5 +70,49 @@ [new OpenApiSecuritySchemeReference(scheme.HeaderName)] = [] return options; } + + // internal OpenApiOptions UseApiSecuritySchemes(OpenApiConfig? config) + // { + // if (config?.SecuritySchemes is not { Count: > 0 }) + // { + // return options; + // } + // + // options.AddDocumentTransformer((document, _, _) => + // { + // document.Components ??= new OpenApiComponents(); + // document.Components.SecuritySchemes ??= new Dictionary(StringComparer.Ordinal); + // + // foreach (var scheme in config.SecuritySchemes) + // { + // document.Components.SecuritySchemes[scheme.HeaderName] = new OpenApiSecurityScheme + // { + // Type = SecuritySchemeType.ApiKey, + // In = ParameterLocation.Header, + // Name = scheme.HeaderName, + // Description = scheme.Description + // }; + // } + // + // return Task.CompletedTask; + // }); + // + // options.AddOperationTransformer((operation, _, _) => + // { + // operation.Security ??= new List(); + // + // foreach (var scheme in config.SecuritySchemes) + // { + // operation.Security.Add(new OpenApiSecurityRequirement + // { + // [new OpenApiSecuritySchemeReference(scheme.HeaderName)] = [] + // }); + // } + // + // return Task.CompletedTask; + // }); + // + // return options; + // } } } diff --git a/src/SharedKernel/SharedKernel.csproj b/src/SharedKernel/SharedKernel.csproj index 639acb6..41b4c1c 100644 --- a/src/SharedKernel/SharedKernel.csproj +++ b/src/SharedKernel/SharedKernel.csproj @@ -8,13 +8,13 @@ Readme.md Pandatech MIT - 2.1.1 + 2.1.2 Pandatech.SharedKernel Pandatech Shared Kernel Library Pandatech, shared kernel, library, OpenAPI, Swagger, utilities, scalar Pandatech.SharedKernel provides centralized configurations, utilities, and extensions for ASP.NET Core projects. For more information refere to readme.md document. https://github.com/PandaTechAM/be-lib-sharedkernel - request/response logging armenian support + Swagger headers bug fix @@ -65,7 +65,7 @@ - +