47 lines
1.5 KiB
C#
47 lines
1.5 KiB
C#
using System.Linq;
|
|
using System.Collections.Generic;
|
|
using Microsoft.AspNetCore.Authorization;
|
|
using Swashbuckle.AspNetCore.Swagger;
|
|
using Swashbuckle.AspNetCore.SwaggerGen;
|
|
using Microsoft.OpenApi.Models;
|
|
|
|
namespace RMuseum.Swashbuckle
|
|
{
|
|
/// <summary>
|
|
/// //https://mattfrear.com/2018/07/21/add-an-authorization-header-to-your-swagger-ui-with-swashbuckle-revisited/
|
|
/// </summary>
|
|
public class SecurityRequirementsOperationFilter : IOperationFilter
|
|
{
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="operation"></param>
|
|
/// <param name="context"></param>
|
|
public void Apply(OpenApiOperation operation, OperationFilterContext context)
|
|
{
|
|
// Policy names map to scopes
|
|
var requiredScopes = context.MethodInfo
|
|
.GetCustomAttributes(true)
|
|
.OfType<AuthorizeAttribute>()
|
|
.Select(attr => attr.Policy)
|
|
.Distinct();
|
|
|
|
if (requiredScopes.Any())
|
|
{
|
|
var oAuthScheme = new OpenApiSecurityScheme
|
|
{
|
|
Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "oauth2" }
|
|
};
|
|
|
|
operation.Security = new List<OpenApiSecurityRequirement>
|
|
{
|
|
new OpenApiSecurityRequirement
|
|
{
|
|
[ oAuthScheme ] = requiredScopes.ToList()
|
|
}
|
|
};
|
|
}
|
|
}
|
|
}
|
|
}
|