Добавить фильтр авторизации атрибутов в Swashbuckler Реализация Swagger - PullRequest
0 голосов
/ 15 февраля 2019

Нужно добавить AuthorizeFilterAttribute или AnonymousFilterAttribute к конечной точке в реализации Swagger в Swashbuckle, чтобы я мог видеть, какой атрибут используется на каждой конечной точке в сгенерированном файле документации в работающем webapi, который заканчивается на / swagger.Возможно ли это течение?

Я специально хотел бы добавить большую жирную метку, которая говорит, что эта конечная точка [Анонимная] или что конечная точка использует [Авторизовать], и чтобы они выглядели иначе, чем текст резюме или примечания.

Также я хотел бы иметь возможность отфильтровывать все различные типы этих атрибутов фильтра ограничения для каждой конечной точки, включая [NonAction], [Authorize] и [Anonymous], где один из них может находиться в верхней части каждой конечной точки контроллера.Возможно, даже в конце концов добавьте другие типы FilterAttributes, кроме этих, на каждую конечную точку.

В настоящее время похоже, что только методы HTTP, объекты запроса и ответа могут быть получены в текущей реализации, поэтому я не смог найти точную информациюна этом.

Поскольку это реализация Swagger, эти специальные атрибутные фильтры .NET не переводятся в Swashbuckle b / c, они реализуют только то, что находится в спецификации Swagger, и ничего больше?

Наконец, ихСпецифические расширения .NET для реализации Swashbuckle, которые делают это?

Спасибо!

1 Ответ

0 голосов
/ 22 мая 2019

Для части, добавляющей метку к незащищенным методам / действиям, вы можете использовать фильтр операций, подобный этому

  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>();} );

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

...