2017-06-08 4 views
1

Da ich am Asp.Net core Authorization Teil arbeite, brauchte ich eine neue Eigenschaft in AuthorizeAttribute, die ich als einen zusätzlichen Berechtigungswert verwenden möchte. Also, ich habe die AuthorizeAttribute in meinem eigenen benutzerdefinierten Autorize-Attribut erweitert. Siehe unten:Asp.Net Core: Zugriff auf benutzerdefinierte AuthorizeAttribute-Eigenschaft in AuthorizeHandler

public class RoleAuthorizeAttribute : Microsoft.AspNetCore.Authorization.AuthorizeAttribute 
    { 
     public string Permission { get; private set; } 

     public RoleAuthorizeAttribute(string policy, string permission) : base(policy) 
     { 
      this.Permission = permission; 
     } 
    } 

Dann habe ich eine AuthorizationHandler erstellt, wie unten für die Anforderung zu überprüfen:

public class RolePermissionAccessRequirement : AuthorizationHandler<RolePermissionDb> 
    { 
     protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RolePermissionDb requirement) 
     { 
      // check here.. 
      context.Succeed(requirement); 

      return Task.FromResult(0); 
     } 
    } 

Alle entsprechenden Service-Erfassungs Mapping ich bereits getan haben, nur hier weggelassen.

Jetzt mag ich meine Attribute wie diese auf Controller-Aktion Ebene verwenden:

[RoleAuthorize("DefaultPolicy", "CustomPermission")] 
public IActionResult List() 
{ 
} 

Würde mir jemand vorschlagen, wie würde ich die Erlaubnis Eigenschaftswert auf der Oberseite der Aktionsmethode in der Prozedur gegeben zugreifen RolePermissionAccessRequirement ??

Ich möchte eine Art von Zugriffsregel basierend auf benutzerdefinierten Erlaubnis Wert in der Authorize attribute oben auf Aktion Methode durchführen.

Vielen Dank im Voraus!

Antwort

0

Um ein benutzerdefiniertes Attribut Authorize zu parametrieren, erstellen Sie einen Autorisierungsfilter, der IAsyncAuthorizationFilter implementiert. Dann wickeln Sie den Filter in einem TypeFilterAttribute-Derived-Attribut. Dieses Attribut kann Parameter akzeptieren und an den Konstruktor des Autorisierungsfilters übergeben.

Anwendungsbeispiel:

[AuthorizePermission(Permission.Foo, Permission.Bar)] 
public IActionResult Index() 
{ 
    return View(); 
} 

Umsetzung:

public class AuthorizePermissionAttribute : TypeFilterAttribute 
{ 
    public AuthorizePermissionAttribute(params Permission[] permissions) 
     : base(typeof(PermissionFilter)) 
    { 
     Arguments = new[] { new PermissionRequirement(permissions) }; 
     Order = Int32.MinValue; 
    } 
}  

public class PermissionFilter : Attribute, IAsyncAuthorizationFilter 
{ 
    private readonly IAuthorizationService _authService; 
    private readonly PermissionRequirement _requirement; 

    public PermissionFilter(
     IAuthorizationService authService, 
     PermissionRequirement requirement) 
    { 
     //you can inject dependencies via DI    
     _authService = authService; 

     //the requirement contains permissions you set in attribute above 
     //for example: Permission.Foo, Permission.Bar 
     _requirement = requirement; 
    } 

    public async Task OnAuthorizationAsync(AuthorizationFilterContext context) 
    { 
     bool ok = await _authService.AuthorizeAsync(
      context.HttpContext.User, null, _requirement); 

     if (!ok) context.Result = new ChallengeResult(); 
    } 
} 

Zusätzlich eine PermissionHandler in DI registrieren PermissionRequirement mit Berechtigungsliste zu handhaben:

public class PermissionHandler : AuthorizationHandler<PermissionRequirement> 

Schauen Sie sich das this GitHub Projekt für eine vollständige Prüfung Bitte.

+0

@IIya danke für deine tollen Antworten –

Verwandte Themen