1

Ich versuche meine APIs zu schützen, indem ich eine benutzerdefinierte Implementierung für das Autorize-Attribut zur Verfügung stelle.ASP.NET Core: Autorisieren und Sichern von Restful-APIs

Autorisieren von Benutzern basierend auf Ressource und Operation, die ich für jede Aktion angeben. In ASP.Net MVC, es wurde wie folgt arbeiten:

[CustomAuthorize(Resource = "Values", Operation="List") 
    public IEnumerable<string> Get() 
    { 
     return new string[] { "value1", "value2" }; 
    } 

In CustomAuthorize Klasse, zu validieren ich, wenn die angemeldeten Benutzer, um die Erlaubnis erteilt, diese Ressource zugreifen, indem Sie die Berechtigungen in seinen Rollen zu überprüfen.

public class CustomAuthorize : AuthorizeAttribute 
{ 
    public string Resource { get; set; } 
    public string Operation { get; set; } 

    //validation here 
} 

Ich möchte das in ASP.NET Core implementieren? Ist dies durch die benutzerdefinierte richtlinienbasierte Autorisierung und wie übergeben Sie die Betriebs- und Ressourcenparameter?

Antwort

1

Ich habe es mit IAuthorizationRequirment und AuthorizationHandler implementiert. Ich übergebe die Ressource/Operation als String. In ResourceRequirementHandler werde ich es auf „/“ dann tun meine Logik gegen (Resource und Operation) aufgeteilt basiert:

namespace ResoucreAPIs.Filters 
{ 
    public class ResourceRequirement : IAuthorizationRequirement 
    { 
     public ResourceRequirement(string resource) 
     { 
      _resource = resource; 
     } 

     protected string _resource { get; set; } 
    } 

    public class ResourceRequirementHandler : AuthorizationHandler<ResourceRequirement> 
    { 
     protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, 
      ResourceRequirement requirement) 
     { 
      //check if the user can access this resource by validating //"requirement" against set of permissions in his claim idenity 
      return Task.CompletedTask; 
     } 
    } 
} 

Dann die Handler und alle zugehörigen Richtlinien registrieren und es in „ConfigureServices“ in Startup-Klasse aufrufen:

protected void SetResourceAuthorizationRequirements(IServiceCollection services) 
    { 

     services.AddAuthorization(options => 
     { 
      options.AddPolicy("AdSingleRead", policy => policy.Requirements.Add(new Filters.ResourceRequirement("AdSingle/Read"))); 
      options.AddPolicy("AdListRead", policy => policy.Requirements.Add(new Filters.ResourceRequirement("AdList/Read"))); 
      options.AddPolicy("AdByCustomerRead", policy => policy.Requirements.Add(new Filters.ResourceRequirement("AdByCustomer/Read"))); 
      options.AddPolicy("AdModify", policy => policy.Requirements.Add(new Filters.ResourceRequirement("Ad/Modify"))); 
      options.AddPolicy("AdDelete", policy => policy.Requirements.Add(new Filters.ResourceRequirement("Ad/Delete"))); 
     }); 

     services.AddSingleton<IAuthorizationHandler, Filters.ResourceRequirementHandler>(); 

    } 

diese Richtlinien für jede Aktion angeben:

[HttpGet] 
    [Authorize(Policy = "AdListRead")] 
    public IEnumerable<string> GetAllAds() 
    { 
     return new string[] { "value1", "value2" }; 
    } 

    [Authorize(Policy = "AdSingleRead")] 
    public string Get(int id) 
    { 
     return "value"; 
    } 

    [HttpPost] 
    [Authorize(Policy = "AdModify")] 
    public void Post([FromBody]string value) 
    { 
    } 


    [HttpPut("{id}")] 
    [Authorize(Policy = "AdModify")] 
    public void Put(int id, [FromBody]string value) 
    { 
    } 


    [HttpDelete("{id}")] 
    [Authorize(Policy = "AdDelete")] 
    public void Delete(int id) 
    { 
    } 
Verwandte Themen