【发布时间】:2020-05-15 23:40:57
【问题描述】:
我需要通过 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
【问题讨论】:
标签: c# asp.net-core impersonation