1

Authorize属性のカスタム実装を提供してAPIを保護しようとしています。ASP.NETコア:安価なAPIの承認とセキュリティ

リソースと操作に基づいてユーザーを認証します。これは、各操作ごとに指定します。 ASP.Net MVCで、それは次のように働いていた:ログインしているユーザーの彼の役割の権限をチェックして、このリソースにアクセスする権限を付与されている場合

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

をCustomAuthorizeクラスでは、私が検証します。

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

    //validation here 
} 

これをASP.NET Coreに実装したいですか?これは、カスタムポリシーベースの認証と、操作とリソースのパラメータを渡す方法ですか?

答えて

1

IAuthorizationRequirmentとAuthorizationHandlerを使用して実装しました。リソース/操作を文字列として渡しています。 、そして、

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; 
     } 
    } 
} 

ハンドラおよび関連するすべてのポリシーを登録し、起動クラスで「ConfigureServices」でそれを呼び出す:ResourceRequirementHandlerで私は、「/」、その後(資源・運用)に対する私のロジックを行うに基づいて、それを分割します

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>(); 

    } 

アクションごとにこれらのポリシーを指定します。

[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) 
    { 
    } 
関連する問題