Авторизуйтесь с утверждениями вместо политик в ASP. Net Идентичность - PullRequest
0 голосов
/ 19 апреля 2020

Мне нужно перенести приложение с настраиваемой авторизацией на основе наличия «ключей» и «дверей». Как правило, пользователю назначается несколько ключей, и этот пользователь не может (не может) что-либо делать / открывать двери в зависимости от полученных им ключей.

Очевидное решение заключается в переходе к авторизации на основе утверждений ASP . Net Базовая идентичность. Каждый ключ становится претензией. Дело в том, что я хотел бы проверить непосредственно наличие претензии на открытие двери, а не политику. Это, чтобы избежать написания (много как есть сотни ключей) кода.

Итак, от:

Startup.cs:
   options.AddPolicy("Key1", policy => policy.RequireClaim("Key1"));
Controller:
   [Authorize(Policy = "Key1")]

К чему-то вроде:

Controller:
   [Authorize(Claim = "Key1")]

Какой лучший способ достичь этого?

1 Ответ

1 голос
/ 20 апреля 2020

Рекомендованным способом является использование авторизации на основе политик, вы можете нажать здесь для аналогичного обсуждения.

Вы можете использовать пользовательский фильтр авторизации для удовлетворения ваших требований, если вы просто проверите, есть ли претензия Тип существует в заявках пользователя, вы можете попробовать ниже пример кода:

ClaimRequirementFilter.cs:

public class ClaimRequirementFilter : IAuthorizationFilter
{
    readonly Claim _claim;

    public ClaimRequirementFilter(Claim claim)
    {
        _claim = claim;
    }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var hasClaim = context.HttpContext.User.Claims.Any(c => c.Type == _claim.Type);
        if (!hasClaim)
        {
            context.Result = new ForbidResult();
        }
    }
}

ClaimRequirementAttribute.cs:

public class ClaimRequirementAttribute : TypeFilterAttribute
{
    public ClaimRequirementAttribute(string claimType ) : base(typeof(ClaimRequirementFilter))
    {
        Arguments = new object[] { new Claim(claimType , "") };
    }
}

И использовать как:

[ClaimRequirement("key")]

Если вам также необходимо ограничить стоимость заявки, вы можете воспользоваться примером кода из над ссылкой .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...