.NET Как реализовать вычитание Claims(утверждений) из набора ролей пользователей?
Я использую стандартную ролевую модель из microsoft identity (.net 9). У каждой роли есть свой набор утверждений, у каждого пользователя есть набор ролей. Сами утверждения содержат значения(value) вида "Запрещено" и "Разрешено". Стандартная схема ограничения доступам политиками разрешает доступ пользователям имеющим нужное утверждение независимо от его значения.
примеры моего кода с ограничениями доступа:
@page "/counter"
@attribute [Authorize(Policy = "Кликер.Cтраница")]
<AuthorizeView Policy="Кликер.Добавление">
<button class="btn btn-primary" @onclick="IncrementCount">Добавить</button>
</AuthorizeView>
<AuthorizeView Policy="Кликер.Вычитание">
<button class="btn btn-primary" @onclick="DecrementCount">Убавить</button>
</AuthorizeView>
И в Programm.cs:
builder.AddPolicy("Кликер.Добавление", policy => policy.RequireClaim("Кликер.Добавление", "Разрешено"));
Как можно организовать схему ограничения доступа, в которой утверждение со значением "запрещено" ограничивает доступ, перекрывая существующие разрешения?
Нужно что-то вроде
builder.AddPolicy("Кликер.Добавление", policy =>
policy.RequireClaim("Кликер.Добавление", "Разрешено").RestrictedClaim("Кликер.Добавление", "Запрещено"));
Ответы (1 шт):
Автор решения: kocapb
→ Ссылка
Решил задачу с помощью дополнительного обработчика:
public static bool HandleRequirement(AuthorizationHandlerContext context,
string claimName, string RequreClaimValue, string DenyClaimValue) {
if (context.User.HasClaim(c => c.Type == claimName && c.Value == RequreClaimValue)
&& !context.User.HasClaim(c => c.Type == claimName && c.Value == DenyClaimValue))
{
return true;
}
else return false;
}
builder.AddPolicy(policyclaim, policy =>
policy.RequireAssertion(context => HandleRequirement(context, policyclaim, GlobalVars.AllowClaimValue, GlobalVars.DenyClaimValue)));