Как проверить, есть ли у Прошедшего проверку пользователя конкретная претензия И совпадает ли сегмент маршрута с UserId? - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь проверить, возможно ли в веб-приложении ASP.NET-Core 2, что если пользователь аутентифицирован в запросе, мы также можем проверить некоторые атрибуты Filter / ActionMethod:

  • У них есть конкретное требование
  • Маршрут имеет сегмент string id (например, HttpPut[("{id}")]), и этот сегмент id должен совпадать с идентификатором Auth'd пользователя.
  • Запрос включает в себя заголовок JWT с bearer token, который используется для «создания» Аутентифицированной идентичности (которая работает на 100%).

, например * * 1016

  • HTTP PUT /accounts/PureKrome | Пользователь Id:PureKrome | Претензия: Ирреливант. => Можете продолжить. [Вы обновляете себя. Не нужно никаких особых претензий при обновлении себя.]
  • HTTP PUT /accounts/PureKrome | Пользователь является анонимным или Id:SomethingElse | Заявка: irrelivant => Сбой (Запрещенный ответ) [Кто-то пытается обновить вас и не имеет правильной отменяющей заявки. Так что провалились]
  • HTTP PUT /accounts/SomeoneElse | Пользователь Id:PureKrome | Требование: правильное требование. => Можно продолжить [Попытка обновить другого пользователя, НО у вас есть претензия, которая позволяет вам это сделать]

Прямо сейчас я делаю это в своем ActionMethod коде ... одна из первых вещей. Поэтому мне было просто любопытно посмотреть, можно ли этого достичь, используя вместо этого Атрибут, который украшает ActionMethod.

1 Ответ

0 голосов
/ 30 апреля 2018

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

Что-то простое, подобное этому, должно работать нормально:

public class ValidateUserIdRouteAttribute : Attribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var user = context.HttpContext.User;
        var requestedUserId = context.RouteData.Values["id"] as string;
        var currentUserId = user.FindFirstValue(ClaimTypes.NameIdentifier);

        if (requestedUserId != currentUserId &&
            !user.HasClaim(c => c.Type == "may-edit" && c.Value == requestedUserId))
        {
            context.Result = new UnauthorizedResult();
        }
    }
}

А на маршруте это выглядело бы так:

[ValidateUserIdRoute]
[HttpGet("/account/update/{id}")]
public IActionResult UpdateAccount(string id)
{
    // …
}

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

Конечно, вы можете расширить эту идею и добавить к ней некоторые дополнительные функции, например, поддержка различных ключей данных маршрута или что-то в этом роде.

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