Skip to content

Commit a765acf

Browse files
committedMar 20, 2025
fix: always serialize security schemes in components
1 parent ff287bc commit a765acf

File tree

1 file changed

+17
-3
lines changed

1 file changed

+17
-3
lines changed
 

‎src/Microsoft.OpenApi/Models/OpenApiComponents.cs

+17-3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System;
55
using System.Collections.Generic;
6+
using System.Linq;
67
using Microsoft.OpenApi.Interfaces;
78
using Microsoft.OpenApi.Models.Interfaces;
89
using Microsoft.OpenApi.Models.References;
@@ -110,7 +111,7 @@ public void SerializeAsV31(IOpenApiWriter writer)
110111
// however if they have cycles, then we will need a component rendered
111112
if (writer.GetSettings().InlineLocalReferences)
112113
{
113-
RenderComponents(writer, (writer, element) => element.SerializeAsV31(writer));
114+
RenderComponents(writer, (writer, element) => element.SerializeAsV31(writer), OpenApiSpecVersion.OpenApi3_1);
114115
return;
115116
}
116117

@@ -148,7 +149,7 @@ public void SerializeAsV3(IOpenApiWriter writer)
148149
// however if they have cycles, then we will need a component rendered
149150
if (writer.GetSettings().InlineLocalReferences)
150151
{
151-
RenderComponents(writer, (writer, element) => element.SerializeAsV3(writer));
152+
RenderComponents(writer, (writer, element) => element.SerializeAsV3(writer), OpenApiSpecVersion.OpenApi3_0);
152153
return;
153154
}
154155

@@ -315,14 +316,27 @@ private void SerializeInternal(IOpenApiWriter writer, OpenApiSpecVersion version
315316
writer.WriteEndObject();
316317
}
317318

318-
private void RenderComponents(IOpenApiWriter writer, Action<IOpenApiWriter, IOpenApiSerializable> callback)
319+
private void RenderComponents(IOpenApiWriter writer, Action<IOpenApiWriter, IOpenApiSerializable> callback, OpenApiSpecVersion version)
319320
{
320321
var loops = writer.GetSettings().LoopDetector.Loops;
321322
writer.WriteStartObject();
322323
if (loops.TryGetValue(typeof(OpenApiSchema), out var schemas))
323324
{
324325
writer.WriteOptionalMap(OpenApiConstants.Schemas, Schemas, callback);
325326
}
327+
// always render security schemes as inlining of security requirement objects is not allowed in the spec
328+
if (SecuritySchemes is not null && SecuritySchemes.Any())
329+
{
330+
writer.WriteOptionalMap(
331+
OpenApiConstants.SecuritySchemes,
332+
SecuritySchemes,
333+
(w, key, component) =>
334+
{
335+
if (version is OpenApiSpecVersion.OpenApi3_1)
336+
component.SerializeAsV31(writer);
337+
component.SerializeAsV3(writer);
338+
});
339+
}
326340
writer.WriteEndObject();
327341
}
328342

0 commit comments

Comments
 (0)
Please sign in to comment.