1 回答

TA貢獻1810條經驗 獲得超5個贊
asp.net core中相關的API有:
授權服務
授權策略
授權要求
IAuthorizationHandler
您正在尋找的授權模式稱為 Resource-based authorization
https://learn.microsoft.com/en-us/aspnet/core/security/authorization/resourcebased?view=aspnetcore-2.2
基本上,您可以定義 AuthorizationPolicy,并將其應用于資源實例:
var ticket = _ticketRepository.Find(ticketID);
var authorizationResult = await _authorizationService
.AuthorizeAsync(User, ticket, "EditTicketPolicy");
在授權處理程序中,您可以檢查用戶是否是資源的所有者。
public class ResourceOwnerRequirement : IAuthorizationRequirement
{
}
public class ResourceOwnerHandler
: AuthorizationHandler<ResourceOwnerRequirement, MyBusinessObject>
//: AuthorizationHandler<ResourceOwnerRequirement> use this overload to handle all types of resources...
{
protected override Task HandleRequirementAsync(
AuthorizationHandlerContext context,
ResourceOwnerRequirement requirement,
MyBusinessObject resource)
{
int createdByUserId = resource.CreatedBy;
Claim userIdClaim = ((ClaimsIdentity)context.User.Identity).FindFirst("UserId");
if (int.TryParse(userIdClaim.Value, out int userId)
&& createdByUserId == userId)
{
context.Succeed(requirement);
}
}
}
//admin can do anything
public class AdminRequirementHandler : IAuthorizationHandler
{
public Task HandleAsync(AuthorizationHandlerContext context)
{
if (context.User.Claims.Any(c => c.Type == "Role" && c.Value == "Administator"))
{
while (context.PendingRequirements.Any())
{
context.Succeed(context.PendingRequirements.First());
}
}
return Task.CompletedTask;
}
}
順便說一句,這仍然可以稱為聲明或基于角色的授權。具有特定角色的用戶可以編輯自己的工單,但具有管理員角色的用戶還可以編輯其他工單。不同之處在于您將授權應用于資源,而不僅僅是操作
- 1 回答
- 0 關注
- 134 瀏覽
添加回答
舉報