Я написал следующий код для обработки авторизации. Предоставление доступа или отсутствие доступа может быть достигнуто с помощью атрибута authorize. У меня такой вопрос: существует ли стандартный способ обработки частичного доступа, когда некоторые пользователи имеют доступ ко всему, а некоторые - к небольшим ресурсам на основе роли, как показано в операторе if ниже?
Запись если еще блок , как показано ниже везде, мне не кажется правильным? Пожалуйста, предложите, если есть лучший способ сделать это.
[Authorize(Roles ="admin,superadmin")]
public async Task<IActionResult> Index()
{
if (User.IsInRole("superadmin"))
{
//get all groups
}
else
{
//get only groups that the user belong to
}
}
Обновлено (решение) на основе этого обсуждения: я добавил следующий код для обработки моего сценария. Любые комментарии или предложения приветствуются.
public class SuperAdminUsersRequirement : IAuthorizationRequirement
{
public SuperAdminUsersRequirement(params string[] roles)
{
AllowedRoles = roles;
}
public string[] AllowedRoles { get; set; }
}
public class SuperAdminAuthorizationHander : AuthorizationHandler<SuperAdminUsersRequirement>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, SuperAdminUsersRequirement requirement)
{
if(UserIsAllowed(context, requirement))
{
context.Succeed(requirement);
}
else
{
context.Fail();
}
return Task.CompletedTask;
}
private bool UserIsAllowed(AuthorizationHandlerContext context, SuperAdminUsersRequirement requirement)
{
if (context.User.Claims != null)
{
var claims = from userClaims in context.User.Claims
where userClaims.Type == ClaimTypes.Role
select userClaims.Value;
if (requirement.AllowedRoles.Intersect(claims, StringComparer.OrdinalIgnoreCase).Any())
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
}
startup.cs: можно настроить для добавления дополнительных ролей, имеющих полный доступ
services.AddAuthorization(options =>
{
options.AddPolicy("HasAllAccess", policy =>
policy.Requirements.Add(new SuperAdminUsersRequirement(AdminRole.SUPER_ADMIN.ToString()
)));
});
controller.cs
var authorizationResult = await _authorizationService.AuthorizeAsync(User, "HasAllAccess");
if(authorizationResult.Succeeded)
{
//fetch everything
}
else
{
// fetch partial data
}