Как безопасно передавать данные из атрибута в действие в asp-net Web API - PullRequest
1 голос
/ 23 мая 2019

Итак, мой вариант использования следующий: я создал собственный атрибут Authorize, который я использую только для некоторых конкретных действий, и он отлично работает для меня.
Теперь, когда кто-то успешно авторизован, я хочу передать некоторые параметрыиз атрибута CustomAuthorizeAttribute к вызываемому действию.Я получил эти параметры из токена, поэтому они надежно добрались до атрибута authorize.

    public class CustomAuthorizeAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(HttpActionContext actionContext)
        {
            // authorizes successfully
        }
    }

Моей первоначальной идеей было «привязать» параметры к HttpContext в качестве заголовков, но я считаю, что это небезопасно.способ их передачи вообще.

Есть ли способ их передачи, без необходимости шифровать, а затем дешифровать их в действии?

        [HttpPost]
        [CustomAuthorize]
        public async Task<IHttpActionResult> Post()

1 Ответ

1 голос
/ 23 мая 2019

Вы можете создать свой собственный тип Принципала, который реализует IPrincipal, или расширить существующий тип субъекта, например ClaimsPrincipal.

. Затем в коде CustomAuthorizationAttribute вы можете установить свойсвойства из расшифрованного токена.Вернувшись в контроллер, вы сможете получить доступ к принципалу и получить те значения, которые вы установили.

Ссылки: IPrincipal , Заявка принципала

Псевдокод, свободно основанный на ClaimsPrincipal, как я уже использовал ранее.

public class CustomPrincipal : ClaimsPrincipal
{
    public CustomPrincipal(IEnumerable<ClaimsIdentity> identities, string phone)
         : base(identities)
    {
        this.PhoneNumber = phone;
    }

    // My properties that I need.
    public string PhoneNumber { get; }
}

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        ... other code ...

        context.Principal = new CustomPrincipal( <stuff to set> );

    }
}

Затем в вашем контроллере выполняются действия, которые разрешены:

CustomPrincipal principal = this.RequestContext.Principal as CustomPrincipal;
... use principal.PhoneNumber etc ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...