Добавить фильтр авторизации атрибутов в 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>();} );

Я не понял, что вы имеете в виду, отфильтровывая различные атрибуты, но я надеюсь, что приведенный выше код поможет вам проверить наличие атрибута и сделать то, что вы хотите сделать.

Другие вопросы по тегам