假设使用 ASP.NET Core 和 Swashbuckle,您可以使用 MarkupFilter 在 Swagger UI 中提供附加信息:
using System;
using System.Collections.Immutable;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Web;
using Microsoft.AspNetCore.Authorization;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
namespace Tool
{
internal class AuthorizationMarkupFilter : IOperationFilter
{
private static ImmutableHashSet<string> GetPolicies(MethodInfo methodInfo)
{
var actionAttributes = methodInfo.GetCustomAttributes<AuthorizeAttribute>(true);
var controllerAttributes = methodInfo.DeclaringType.GetTypeInfo().GetCustomAttributes<AuthorizeAttribute>(true);
var result = ImmutableHashSet<string>.Empty;
foreach (var attribute in actionAttributes.Union(controllerAttributes))
{
if (!string.IsNullOrWhiteSpace(attribute.Policy))
{
result = result.Add(attribute.Policy);
}
}
return result;
}
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
var policies = GetPolicies(context.MethodInfo);
if (policies.Count > 0)
{
var sb = new StringBuilder();
sb.AppendLine("<div>");
sb.AppendLine("<b>Authorization:</b>");
sb.AppendLine("<ul>");
foreach (string policy in policies.OrderBy(s => s))
{
sb.Append("<li>").Append(HttpUtility.HtmlEncode(policy)).AppendLine("</li>");
}
sb.AppendLine("</ul>");
sb.AppendLine("</div>");
operation.Description += sb.ToString();
}
}
}
}
然后在你的“启动”类中:
services.AddSwaggerGen(c =>
{
// ...
c.OperationFilter<AuthorizationMarkupFilter>();
}
我已经从一些更大的解决方案中删除了它,所以我希望它能编译。但我希望你明白了。