У меня 2 политики: Readers
и Writers
. Для каждой из этих политик у меня было бы несколько значений, принадлежащих им:
Readers: [1,2,3,4,5,6]
Writers: [100,400,500]
Эти массивы будут храниться в базе данных / извлекаться с помощью вызова Http.
Как я могу вместо этогопроверки требуемого значения претензии по некоторым предопределенным значениям, как здесь:
services.AddAuthorization(options =>
{
options.AddPolicy("Readers",
policy =>policy.RequireClaim("UserID", "1", "2", "3", "4", "5"));
});
Получите что-то вроде этого:
CheckPolicyService someService;
services.AddAuthorization(options =>
{
options.AddPolicy("Readers",
policy =>policy.RequireClaim("UserID", async (userId)=>await someService.CheckClaimAsync(new Claim("UserID",userId,),"Readers"));
});
Как я могу вместо проверки, что EmployerID
находится взаданный список значений вместо вызова службы, которая проверяет это?
public class PolicyRepo
{
public string PolicyID{get;set;}
public string[] Users{get;set;}
}
public class CheckPolicyService
{
private PolicyRepo [] repos {get;set;} //all policies with their allowed users
public async Task<bool> CheckClaimAsync(Claim userClaim,string policy)
{
if(userClaim.Type!="UserID")
{
return false;
}
bool hasAccess=this.repos.Single(r=>r.PolicyId==policy).Users.Contains(userClaim.Value);
return hasAccess;
}
}
public class Controller
{
[Authorize(Policy="Readers")]
public async Task ReadAsync()
{
}
[Authorize(Policy="Writers")]
public async Task WriteAsync()
{
}
}