53 lines
No EOL
2 KiB
C#
53 lines
No EOL
2 KiB
C#
using Microsoft.AspNetCore.Authentication;
|
|
using Microsoft.AspNetCore.OpenApi;
|
|
using Microsoft.OpenApi.Models;
|
|
|
|
namespace LANCommander.Server;
|
|
|
|
// https://yogeshhadiya33.medium.com/implement-scalar-in-net-api-91d284479d1d
|
|
internal sealed class BearerSecuritySchemeTransformer : IOpenApiDocumentTransformer
|
|
{
|
|
private readonly IAuthenticationSchemeProvider _authenticationSchemeProvider;
|
|
|
|
public BearerSecuritySchemeTransformer(IAuthenticationSchemeProvider authenticationSchemeProvider)
|
|
{
|
|
_authenticationSchemeProvider = authenticationSchemeProvider;
|
|
}
|
|
|
|
public async Task TransformAsync(OpenApiDocument document, OpenApiDocumentTransformerContext context, CancellationToken cancellationToken)
|
|
{
|
|
var authenticationSchemes = await _authenticationSchemeProvider.GetAllSchemesAsync();
|
|
|
|
if (authenticationSchemes.Any(authScheme => authScheme.Name == "Bearer"))
|
|
{
|
|
var requirements = new Dictionary<string, OpenApiSecurityScheme>
|
|
{
|
|
["Bearer"] = new OpenApiSecurityScheme
|
|
{
|
|
Type = SecuritySchemeType.Http,
|
|
Scheme = "Bearer",
|
|
In = ParameterLocation.Header,
|
|
BearerFormat = "JWT"
|
|
}
|
|
};
|
|
|
|
document.Components ??= new OpenApiComponents();
|
|
document.Components.SecuritySchemes = requirements;
|
|
|
|
foreach (var operation in document.Paths.Values.SelectMany(path => path.Operations))
|
|
{
|
|
operation.Value.Security.Add(new OpenApiSecurityRequirement
|
|
{
|
|
[new OpenApiSecurityScheme
|
|
{
|
|
Reference = new OpenApiReference
|
|
{
|
|
Id = "Bearer",
|
|
Type = ReferenceType.SecurityScheme
|
|
}
|
|
}] = Array.Empty<string>()
|
|
});
|
|
}
|
|
}
|
|
}
|
|
} |