Программно добавить атрибут [AllowAnonymous] ко всем моим методам контроллера - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть API REST WebAPI2 с несколькими контроллерами. Я использую аутентификацию на основе ролей. Я поместил атрибуты [Authorize] на все мои контроллеры и некоторые методы. Однако в среде DEV я хочу отключить аутентификацию. Я надеялся, что смогу вставить некоторый код в WebApiConfig, такой как:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
        config.EnableCors(new EnableCorsAttribute("*", "*", "*"));

        //==============================================
        // NOTE: disable all authentication in the DEV_ENVIRONMENT

        if (Environment.GetEnvironmentVariable("DEV_ENVIRONMENT") == "1")
        {
            config.Filters.Add(new AllowAnonymousAttribute());
        }
    }
}

Однако, это не компилируется, потому что

error CS1503: Argument 1: cannot convert from 
'System.Web.Http.AllowAnonymousAttribute' to 
'System.Web.Http.Filters.IFilter'

Есть ли способ во время выполнения отключить всю аутентификацию в моем REST API?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Я бы не "удалил" авторизацию. Предположим, у вас есть клиент, а CustomerId - это претензия, тогда вы не можете протестировать код, потому что претензии отсутствуют. Вместо этого я бы решил добавить личность для целей разработки.

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

using System.Security.Principal;
using System.Web;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;

public class AddIdentityFilter : AuthorizationFilterAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        HttpContext.Current.User = new GenericPrincipal(new GenericIdentity("John"), new[] { "Admin" });
        base.OnAuthorization(actionContext);
    }
}

В WebApiConfig.cs добавьте фильтр:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.SuppressDefaultHostAuthentication();

        // Add some logic here to determine the environment
        var isDevelopment = true;

        if (isDevelopment)
            config.Filters.Add(new AddIdentityFilter());

        // ...
    }

Таким образом, вы можете определить несколько сценариев для тестирования во время разработки.

0 голосов
/ 10 ноября 2018

Я поделюсь несколькими способами сделать это. Как работают мои сервисы, у нас есть базовый класс контроллеров FooController, в котором есть вся логика для сервиса. Для среды (пожалуйста, не спрашивайте!) У нас есть DevFooController, производный от FooController.

В методе Register есть нечто, похожее на это:

var controller = (Environment.GetEnvironmentVariable("DEV_ENVIRONMENT") == "1") ? "DevFoo" : "Foo";

/// api/{tenant}/{id}
config.Routes.MapHttpRoute(
      name: "RouteName",
      routeTemplate: "api/{tenant}/{id}",
      defaults: new { controller = controller, action = "actionName" });

Атрибуты применяются на соответствующем контроллере.

Hokey? Ага. Работает? Также Yup.

Другая система, которую я использовал для работы с внедрением зависимостей. Все контроллеры всегда были зарегистрированы. При каждом запросе у инжектора было несколько сочных битов о запросе (dev / prod, flight, geo и т. Д.), И он мог выбрать правильный конкретный контроллер. Классы выглядели одинаково, но FooController также реализовал IFooController, и несколько зарегистрированных классов были доступны одновременно по сравнению с приведенным выше примером, где доступен только один статически настроенный маршрут.

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

Одной из примечательных функций, которые мы также реализуем таким образом, является поддержка CORS. Он недоступен ни на одной из конечных точек подготовки.

Наконец, у нас есть ActionFilter для нескольких наших методов, которые могут работать так, как вы хотите. Логика «разрешить анонимность» находится в самом ActionFilter. Если your condition is true, фильтр просто продолжается без проверки какой-либо идентичности. Мы выполняем собственный AuthZ, но можем настроить его так, как вы описали.

Надеюсь, что одно из этих предложений будет работать для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...