2016-11-22 8 views
0

MVCコアを使用して、次の問題が発生したWebサイトを整理しています。MVCコア認可

私は2つのグループGroupAとGroupBを持ち、これらのグループにはいくつかのエンティティがあると言います。エンティティはGroupAまたはGroupBに属しますが、同時に両方ではありません。このポリシーは、グループA内のエンティティを更新したいユーザーは、請求ClaimThatAllowsUpdatingEntityInGroupAを持っていることを確認してしまう

AuthorizationOptions.AddPolicy("UpdateEntityInGroupAPolicy", policy => 
{ 
    policy.RequireClaim("ClaimThatAllowsUpdatingEntityInGroupA"); 
}); 

:これらのエンティティの更新を保護するために、私は、次のポリシーを定義しています。 claim ClaimThatAllowsUpdatingEntityInGroupBを使用してGroupBに対しても同様のポリシーを作成できます。

さらに、グループAにはIDが5のエンティティがあり、グループBにはIDが10のエンティティがあるとします。(ClaimThatAllowsUpdatingEntityInGroupAは要求していますが、claimThatAllowsUpdatingEntityInGroupBは要求していません) URL:私は今、ユーザーはわずか10へのURLで5を変更して、実際にグループBのid 10と他のエンティティを更新しないことを確認してくださいするにはどうすればよい

http://example.com/entity/5/update

私は、私が質問し、任意の助けてくれてありがとうと明らか午前願っています:)

答えて

0

あなたがAuthorize属性を使用したい場合は、承認フィルターがあなたの実体を認識していないので、あなたがこれを行うことはできません。だから、あなたの場合はResource Based Authorizationが正しい道に向いているようです。

まず仮定して、あなたのエンティティは次のようである:

public class UpdateRequirement : IAuthorizationRequirement 
{ 
} 

が要件と実体

public class YourEntityAuthorizationHandler : AuthorizationHandler<UpdateRequirement, YourEntity> 
    { 
     public override Task HandleRequirementAsync(AuthorizationHandlerContext context, 
                UpdateRequirement requirement, 
                YourEntity resource) 
     { 
      if(resource.Group == "GroupA" && 
       context.User.HasClaim("ClaimThatAllowsUpdatingEntityInGroupA")) 
      { 
       context.Succeed(requirement); 
      } 
      else if(resource.Group == "GroupB" && 
       context.User.HasClaim("ClaimThatAllowsUpdatingEntityInGroupB")) 
      { 
       context.Succeed(requirement); 
      } 
      return Task.CompletedTask; 
     } 
    } 
の認可ハンドラを作成します。

public class YourEntity 
{ 
    public int Id { get; set; } 
    public string Group { get; set; } 
    //... 
} 

、リソースベースの認証

要件を作成を実装するには

最後に、あなたのコントローラロジックでそれを使用します。

public async Task<IActionResult> Update([FromServices]IAuthorizationService authorizationService, int id) 
    { 
     var entity= _entityRepository.Get(id); 

     if (entity == null) 
     { 
      return new NotFoundResult(); 
     } 

     if (await _authorizationService.AuthorizeAsync(User, entity, new UpdateRequirement())) 
     { 
      return View(entity); 
     } 
     else 
     { 
      return new ChallengeResult(); 
     } 
    } 

はまた、あなたの詳細な回答のため、@をblowdartのexample

+0

感謝を参照してください。私は同じようなアプローチを読むこともできます[ここではこの優秀なページ](http://andrewlock.net/resource-specific-authorisation-in-asp-net-core/)。私はそれが行く方法だと思う。ありがとう:) – user2711444

関連する問題