2015-11-13 12 views
6

Ich bin auf der Suche nach einer Möglichkeit, einen benutzerdefinierten Autorisierungsfilter in ASP.NET 5 zu programmieren, wie die aktuelle Implementierung in Richtlinien/Anforderungen beruht, die wiederum allein in der Verwendung verlassen of Claims, also auf das zehnte und sich ständig verändernde Identity System, von dem ich wirklich genug habe (ich habe alle seine Geschmacksrichtungen ausprobiert).DI in eine Anforderung/Richtlinie in ASP.NET MVC 6

Ich habe eine große Anzahl von Permisionen (über 200), die ich nicht als Ansprüche kodieren möchte, da ich mein eigenes Repository für sie habe und einen viel schnelleren Weg, als Hunderte von Strings zu vergleichen ist, was Ansprüche sind am Ende).

Ich brauche einen Parameter in jedem Attribute zu übergeben, die gegen meinen benutzerdefinierten Repository von Berechtigungen geprüft werden sollen:

[Authorize(Requires = enumPermission.DeleteCustomer)] 

Ich weiß, das ist nicht das häufigste Szenario, aber ich denke, es ist nicht eine Kante Fall. Ich habe versucht, es in der Weise zu implementieren, die von @leastprivilege auf seinem großartigen Beitrag "Der Sicherheitszustand in ASP.NET 5 und MVC 6: Autorisierung" beschrieben wird, aber ich habe die gleichen Wände getroffen wie der Autor, der sogar geöffnet hat ein Problem auf der ASP.NET 5 Github Repo, die in einer nicht zu viel klärenden Weise geschlossen wurde: link

Eine Idee, wie dies zu erreichen? Vielleicht mit einer anderen Art von Filter? In diesem Fall, wie?

+0

wo genau ist das Problem? Diese Abhängigkeiten sind nicht aufgelöst oder der Parameter ist nicht gesetzt? –

+0

Das Problem ist, dass ich nicht herausfinden kann, wie die Argumente als ein Array von Objekten übergeben und dann innerhalb des Filters erhalten ... In früheren Versionen wurde es durch Erstellen einer öffentlichen Eigenschaft auf dem Filter selbst mit dem gleichen Namen getan als der Parameter, den Sie passierten (wie oben beschrieben), aber jetzt muss ich ein Objektarray übergeben ... – Vi100

+0

Dies ist das Problem mit dem neuen Autorisierungsfilter, obwohl die Absicht der Fragen war, nach irgendeiner Implementierung zu fragen, die dies mit Richtlinien erreicht/Anforderungen – Vi100

Antwort

1

Es folgt ein Beispiel dafür, wie Sie dieses Szenario erreichen können:

Lassen Sie uns Ihnen ein Service IPermissionStore, die, wenn ein bestimmter Benutzer die erforderlichen Berechtigungen für das Attribut angegeben hat bestätigt genannt haben nehmen.

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

Ich habe nicht sehr klar, wenn dies in einer richtigen ASP.NET 5 Mode ist, aber das funktioniert in der Tat ... Ich akzeptiere diese Antwort jedoch können Sie mir sagen, ob Ihr Beispiel in alten Funktionen, die veraltet sein könnte Zusamenfassend? – Vi100

+0

Sie können im GitHub Repo nach Beispielen suchen, die sich auf 'IFilterFactory' beziehen (zum Beispiel: https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNet.Mvc.Core/FormatFilterAttribute.cs # L16) ... da ASP.NET 5 noch in 'beta' ist, kann ich nicht sicher sagen, dass sich die Dinge nicht ändern würden –

+0

Wenn Sie' IAuthorizationFilter' verwenden, implementieren Sie bitte 'IAsyncAuthorizationFilter' auch, ich hatte ein Problem damit –

Verwandte Themen