.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)));
→ Ссылка