【发布时间】:2017-10-30 05:32:30
【问题描述】:
在尝试使用 .Net Core 的 Identity 实现用户模拟功能时遇到信息不足的问题。我试图让this ASP.NET MVC 4.6 code 在 ASP.NET Core 中工作,但遇到了一些 .NET Core 不再支持的代码行。
所以下面是原始的 4.6 代码,用于传入 userName 并以用户身份登录。
public async Task ImpersonateUserAsync(string userName)
{
var context = HttpContext.Current;
var originalUsername = context.User.Identity.Name;
var impersonatedUser = await userManager.FindByNameAsync(userName);
var impersonatedIdentity = await userManager.CreateIdentityAsync(impersonatedUser, DefaultAuthenticationTypes.ApplicationCookie);
impersonatedIdentity.AddClaim(new Claim("UserImpersonation", "true"));
impersonatedIdentity.AddClaim(new Claim("OriginalUsername", originalUsername));
var authenticationManager = context.GetOwinContext().Authentication;
authenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
authenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = false }, impersonatedIdentity);
}
我已经做到了,但坚持使用 context.GetOwinContext().Authentication 部分,我需要使用当前 cookie 退出,并使用这个新用户登录。
public async Task<IActionResult> ImpersonateUserAsync(string userName)
{
var originalUsername = _httpContextAccessor.HttpContext.User.Identity.Name;
var impersonatedUser = await _userManager.FindByNameAsync(userName);
var impersonatedIdentity = await _userManager.CreateAsync(impersonatedUser);
await _userManager.AddClaimAsync(impersonatedUser, new Claim("UserImpersonation", "true"));
await _userManager.AddClaimAsync(impersonatedUser, new Claim("OriginalUsername", originalUsername));
return RedirectToAction("Index", "Home");
}
有人用过这种方法吗?
【问题讨论】:
-
您是否意识到
_userManager.AddClaimAsync正在将模拟声明添加到数据库中,而不仅仅是添加到cookie 中?因此,每次您使用此用户登录时,此假冒声明都会启用(除非您在取消假冒时将其从数据库中删除) -
这是一个很好的点 trailmax。正如您在链接中看到的那样,它们用于检测是否有人在进行模拟,并用于将用户取消模拟为管理员权限。当我取消模拟时,我应该删除它们。谢谢。
-
@trailmax 没有意识到是你在链接中写了关于模仿的文章。嗨,Trailmax。这当然是一个很好的方法。但是在 .Net Core 方面情况发生了变化。
SignIn不再使用var impersonatedIdentity。SignIn现在只能取ClaimsPrincipal。有什么想法吗?
标签: c# asp.net-identity impersonation asp.net-core-1.1 asp.net-core-identity