2015-11-13 1 views
6

Я ищу способ программирования настраиваемого фильтра авторизации в ASP.NET 5, поскольку текущая реализация зависит от Политики/Требования, которые в свою очередь полагаются исключительно на использование Претензий, таким образом, на бесконечной и постоянно меняющейся Системе идентичности, которой я действительно устал (я пробовал все это вкусы).DI в Требование/Политика в ASP.NET MVC 6

У меня есть большой набор разрешений (более 200), которые я не хочу кодировать в качестве претензий, поскольку у меня есть свой собственный репозиторий для них и гораздо более быстрый способ проверить его, чем сравнивать сотни строк (это вот какие претензии в конце).

Мне нужно передать параметр в каждом атрибуте, который должен быть проверен против моего пользовательского хранилища разрешений:

[Authorize(Requires = enumPermission.DeleteCustomer)] 

Я знаю, что это не самый частый сценарий, но я думаю, что это не край дело. Я пробовал реализовать его так, как описано @leastprivilege на его великолепном посту «Состояние безопасности в ASP.NET 5 и MVC 6: Авторизация», но я попал на те же стены, что и автор, который даже открыл вопрос о репозитории ASP.NET 5 github, который был закрыт в не слишком ясном пояснении: link

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

+0

где именно проблема? Какие зависимости не разрешены или параметр не задан? –

+0

Проблема в том, что я не могу понять, как передать Аргументы в виде массива объектов, а затем получить их внутри фильтра ... В предыдущих версиях это было сделано путем создания публичного свойства в самом фильтре с тем же именем в качестве параметра, который вы проходили (как описано выше), но теперь мне нужно передать массив объектов ... – Vi100

+0

В этом проблема с новым фильтром авторизации, хотя целью этих вопросов было просить любую реализацию, достигающую этого с помощью политик/requirements – Vi100

ответ

1

Ниже приведен пример того, как можно достичь этого сценария:

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

public class MyCustomAuthorizationFilterAttribute : Attribute, IFilterFactory, IOrderedFilter 
{ 
    private readonly Permision[] _permissions; 

    public MyCustomAuthorizationFilterAttribute(params Permision[] permissions) 
    { 
     _permissions = permissions; 
    } 

    public int Order { get; set; } 

    public IFilterMetadata CreateInstance(IServiceProvider serviceProvider) 
    { 
     var store = serviceProvider.GetRequiredService<IPermissionStore>(); 

     return new MyCustomAuthorizationFilter(store, _permissions) 
     { 
      Order = Order 
     }; 
    } 
} 

public class MyCustomAuthorizationFilter : IAuthorizationFilter, IOrderedFilter 
{ 
    private readonly IPermissionStore _store; 
    private readonly Permision[] _permissions; 

    public int Order { get; set; } 

    public MyCustomAuthorizationFilter(IPermissionStore store, params Permision[] permissions) 
    { 
     _store = store; 
     _permissions = permissions; 
    } 

    public void OnAuthorization(AuthorizationContext context) 
    { 
     // Check if the action has an AllowAnonymous filter 
     if (!HasAllowAnonymous(context)) 
     { 
      var user = context.HttpContext.User; 
      var userIsAnonymous = 
       user == null || 
       user.Identity == null || 
       !user.Identity.IsAuthenticated; 

      if (userIsAnonymous) 
      { 
       Fail(context); 
      } 
      else 
      { 
       // check the store for permissions for the current user 
      } 
     } 
    } 

    private bool HasAllowAnonymous(AuthorizationContext context) 
    { 
     return context.Filters.Any(item => item is Microsoft.AspNet.Authorization.IAllowAnonymous); 
    } 

    private void Fail(AuthorizationContext context) 
    { 
     context.Result = new HttpUnauthorizedResult(); 
    } 
} 

// Your action 
[HttpGet] 
[MyCustomAuthorizationFilter(Permision.CreateCustomer)] 
public IEnumerable<string> Get() 
{ 
    //blah 
} 
+0

Мне не очень понятно, если это правильно, но это действительно работает ... Я принимаю этот ответ, однако, можете ли вы сказать мне, если ваш пример опирается на старые функции, которые могут быть устаревшими вкратце? – Vi100

+0

Вы можете посмотреть в репозитории github для образцов, связанных с 'IFilterFactory' (например: https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNet.Mvc.Core/FormatFilterAttribute.cs # L16) ... поскольку ASP.NET 5 все еще находится в 'beta', я не могу точно сказать, что что-то не изменится –

+0

Если вы используете' IAuthorizationFilter', пожалуйста, внесите в него 'IAsyncAuthorizationFilter', у меня возникла проблема с ним –

Смежные вопросы