2016-11-22 162 views
0

我正在使用MVC核心的網站,我有以下問題進行整理。MVC核心授權

假設我有兩個GroupA和GroupB組,這些組有一些實體。一個實體屬於GroupA或GroupB--但不能同時屬於這兩個實體。爲了保護這些實體的更新,我已經定義了以下政策:

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

這項政策將確保用戶,誰想要更新組A的實體有要求ClaimThatAllowsUpdatingEntityInGroupA。可以爲聲明ClaimThatAllowsUpdatingEntityInGroupB的GroupB創建類似的策略。

更進一步,讓我們假設組A具有ID爲5的實體和組B具有ID爲10的實體如果給定的用戶(誰的權利要求ClaimThatAllowsUpdatingEntityInGroupA,但不是要求ClaimThatAllowsUpdatingEntityInGroupB)在編號爲5更新實體網址:

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

我現在該如何確保用戶不只是在網址更改爲5〜10和B族居然更新ID是10的其他實體?

我希望我這樣一個問題,並感謝您的幫助:)

回答

0

清楚,如果你想使用Authorize屬性,你不能這樣做,因爲授權過濾器是不知道你的實體。所以,你的情況Resource Based Authorization似乎正確的路要走。

首先假設你的實體是這樣的:

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

爲了實現資源基礎的授權

創建一個要求:

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