Мне нужно реализовать олицетворение пользователя через заголовок HTTP. Например, пользователь отправит запрос на /api/something
с заголовком impersonate=someUser
.
. Я попытался выполнить следующий процесс:
- . Пользователь получает проверку подлинности по одной из нескольких схем проверки подлинности. .
- Аутентифицированный пользователь заменяется имитированным пользователем, если он проходит некоторые проверки безопасности.
- Конечная точка
/api/something
называется
Я написал несколько пользовательских промежуточное программное обеспечение для этого, которое запускается сразу после встроенной промежуточной программы аутентификации:
if (!context.Request.Headers.TryGetValue("%Impersonation header%", out StringValues subject))
{
await _next(context);
return;
}
if (context.User?.Identity?.IsAuthenticated != true)
{
// return error
}
...
context.User = impersonatedUser
await _next(context);
Однако, когда он наконец достигает контроллера, первоначальный пользователь все еще используется, потому что ClaimsPrincipal
был заменен авторизацией по умолчанию на новый объект с двумя идентичностями. Первая личность - это реальный пользователь, вторая личность - это олицетворенный пользователь.
Я мог бы потенциально разрешить пользователя, используя второе удостоверение личности, но я не уверен, что этот процесс следует передовым методам?
Редактировать: это для ASP. NET Core 2.2 / 3.1