Это на самом деле не слишком сложно. Все, что вам нужно сделать, - это фильтр авторизации , который просматривает значения маршрута и затем проверяет его у текущего пользователя.
Что-то простое, подобное этому, должно работать нормально:
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 будет использоваться для аутентификации пользователя, который может правильно или не может настроить заявки, а затем вы просто проверяете эти заявки, чтобы увидеть, разрешен ли доступ к маршруту.
Конечно, вы можете расширить эту идею и добавить к ней некоторые дополнительные функции, например, поддержка различных ключей данных маршрута или что-то в этом роде.