@@ -30,42 +30,38 @@ internal OpenApiOptions AddDocument(Document doc, OpenApiConfig openApiConfig)
3030
3131 return options ;
3232 }
33-
33+
3434 internal OpenApiOptions UseApiSecuritySchemes ( OpenApiConfig ? config )
3535 {
36- if ( config ? . SecuritySchemes is not { Count : > 0 } )
37- {
38- return options ;
39- }
36+ if ( config ? . SecuritySchemes is not { Count : > 0 } ) { return options ; }
4037
4138 options . AddDocumentTransformer ( ( document , _ , _ ) =>
4239 {
4340 document . Components ??= new OpenApiComponents ( ) ;
44- document . Components . SecuritySchemes ??= new Dictionary < string , IOpenApiSecurityScheme > ( StringComparer . Ordinal ) ;
41+ document . Components . SecuritySchemes ??=
42+ new Dictionary < string , IOpenApiSecurityScheme > ( StringComparer . Ordinal ) ;
43+
44+ document . Security ??= new List < OpenApiSecurityRequirement > ( ) ;
45+ document . Security . Clear ( ) ;
4546
46- foreach ( var scheme in config . SecuritySchemes )
47+ foreach ( var s in config . SecuritySchemes )
4748 {
48- document . Components . SecuritySchemes [ scheme . HeaderName ] = new OpenApiSecurityScheme
49+ // Strongly recommended: separate ID from header name.
50+ // If you can't change config now, keep s.HeaderName as the ID.
51+ var schemeId = s . HeaderName ;
52+
53+ document . Components . SecuritySchemes [ schemeId ] = new OpenApiSecurityScheme
4954 {
5055 Type = SecuritySchemeType . ApiKey ,
5156 In = ParameterLocation . Header ,
52- Name = scheme . HeaderName ,
53- Description = scheme . Description
57+ Name = s . HeaderName ,
58+ Description = s . Description
5459 } ;
55- }
56-
57- return Task . CompletedTask ;
58- } ) ;
59-
60- options . AddOperationTransformer ( ( operation , _ , _ ) =>
61- {
62- operation . Security ??= new List < OpenApiSecurityRequirement > ( ) ;
6360
64- foreach ( var scheme in config . SecuritySchemes )
65- {
66- operation . Security . Add ( new OpenApiSecurityRequirement
61+ // IMPORTANT: reference must be created with document context
62+ document . Security . Add ( new OpenApiSecurityRequirement
6763 {
68- [ new OpenApiSecuritySchemeReference ( scheme . HeaderName ) ] = [ ]
64+ [ new OpenApiSecuritySchemeReference ( schemeId , document ) ] = [ ]
6965 } ) ;
7066 }
7167
@@ -74,5 +70,49 @@ [new OpenApiSecuritySchemeReference(scheme.HeaderName)] = []
7470
7571 return options ;
7672 }
73+
74+ // internal OpenApiOptions UseApiSecuritySchemes(OpenApiConfig? config)
75+ // {
76+ // if (config?.SecuritySchemes is not { Count: > 0 })
77+ // {
78+ // return options;
79+ // }
80+ //
81+ // options.AddDocumentTransformer((document, _, _) =>
82+ // {
83+ // document.Components ??= new OpenApiComponents();
84+ // document.Components.SecuritySchemes ??= new Dictionary<string, IOpenApiSecurityScheme>(StringComparer.Ordinal);
85+ //
86+ // foreach (var scheme in config.SecuritySchemes)
87+ // {
88+ // document.Components.SecuritySchemes[scheme.HeaderName] = new OpenApiSecurityScheme
89+ // {
90+ // Type = SecuritySchemeType.ApiKey,
91+ // In = ParameterLocation.Header,
92+ // Name = scheme.HeaderName,
93+ // Description = scheme.Description
94+ // };
95+ // }
96+ //
97+ // return Task.CompletedTask;
98+ // });
99+ //
100+ // options.AddOperationTransformer((operation, _, _) =>
101+ // {
102+ // operation.Security ??= new List<OpenApiSecurityRequirement>();
103+ //
104+ // foreach (var scheme in config.SecuritySchemes)
105+ // {
106+ // operation.Security.Add(new OpenApiSecurityRequirement
107+ // {
108+ // [new OpenApiSecuritySchemeReference(scheme.HeaderName)] = []
109+ // });
110+ // }
111+ //
112+ // return Task.CompletedTask;
113+ // });
114+ //
115+ // return options;
116+ // }
77117 }
78118}
0 commit comments