Добавить фильтр авторизации атрибутов в Swashbuckler Реализация Swagger
Нужно добавить AuthorizeFilterAttribute или AnonymousFilterAttribute к конечной точке в реализации Swagger Swashbuckle, чтобы я мог видеть, какой атрибут используется на каждой конечной точке в сгенерированном файле документации в работающем webapi, который заканчивается на / swagger. Возможно ли это течение?
Я специально хотел бы добавить большой жирный шрифт, который говорит, что эта конечная точка является [Анонимной] или эта конечная точка использует [Авторизация], и чтобы они выглядели иначе, чем текст резюме или примечания.
Также я хотел бы иметь возможность отфильтровывать все различные типы этих атрибутов фильтра ограничения для каждой конечной точки, включая [NonAction], [Authorize] и [Anonymous], где один из них может находиться в верхней части каждой конечной точки контроллера. Может быть, даже в конечном итоге добавить другие типы FilterAttributes помимо них на каждой конечной точке.
В настоящее время похоже, что только методы HTTP, объекты запроса и ответа могут быть получены в текущей реализации, поэтому я не смог найти точную информацию по этому вопросу.
Поскольку это реализация Swagger, эти специальные атрибутные фильтры.NET не переводятся в Swashbuckle b/c, они реализуют только то, что находится в спецификации Swagger, и ничего больше?
И наконец, являются ли их специфичные для.NET расширения реализации Swashbuckle такими?
Спасибо!
0 ответов
Для части, добавляющей метку к незащищенным методам / действиям, вы можете использовать фильтр операций, подобный этому
public class UnprotectedOperationFilter : IOperationFilter
{
private bool HasAttribute(MethodInfo methodInfo, Type type, bool inherit)
{
// inhertit = true also checks inherited attributes
var actionAttributes = methodInfo.GetCustomAttributes(inherit);
var controllerAttributes = methodInfo.DeclaringType.GetTypeInfo().GetCustomAttributes(inherit);
var actionAndControllerAttributes = actionAttributes.Union(controllerAttributes);
return actionAndControllerAttributes.Any(attr => attr.GetType() == type);
}
public void Apply(Operation operation, OperationFilterContext context)
{
bool hasAuthorizeAttribute = HasAttribute(context.MethodInfo, typeof(AuthorizeAttribute), true);
bool hasAnonymousAttribute = HasAttribute(context.MethodInfo, typeof(AllowAnonymousAttribute), true);
// so far as I understood the action/operation is public/unprotected
// if there is no authorize or an allow anonymous (allow anonymous overrides all authorize)
bool isAuthorized = hasAuthorizeAttribute && !hasAnonymousAttribute;
if (!isAuthorized)
{
operation.Description =
"<p><bold>BIG BOLD LABEL indicating an UPROTECTED PUBLIC method</bold></p>"
+ operation.Description;
}
}
}
и добавить его с
services.AddSwaggerGen(c => { c.OperationFilter<UnprotectedOperationFilter>();} );
Я не понял, что вы имеете в виду, отфильтровывая различные атрибуты, но я надеюсь, что приведенный выше код поможет вам проверить наличие атрибута и сделать то, что вы хотите сделать.