C# ASP.NET Core 1.1用户身份模拟
在尝试使用.Net Core的标识实现用户模拟功能时遇到信息不足的问题。我试图在ASP.NET Core中工作,但是遇到了一些.NET Core不再支持的代码行 下面是原始的4.6代码,用于传入C# ASP.NET Core 1.1用户身份模拟,c#,asp.net-identity,impersonation,asp.net-core-1.1,asp.net-core-identity,C#,Asp.net Identity,Impersonation,Asp.net Core 1.1,Asp.net Core Identity,在尝试使用.Net Core的标识实现用户模拟功能时遇到信息不足的问题。我试图在ASP.NET Core中工作,但是遇到了一些.NET Core不再支持的代码行 下面是原始的4.6代码,用于传入userName并作为用户登录 public async Task ImpersonateUserAsync(string userName) { var context = HttpContext.Current; var originalUsername = context.User
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()。身份验证
部分,其中我需要使用当前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");
}
公共异步任务ImpersonateSerAsync(字符串用户名)
{
var originalUsername=_httpContextAccessor.HttpContext.User.Identity.Name;
var impersonatedUser=await\u userManager.FindByNameAsync(用户名);
var impersonatedIdentity=await\u userManager.CreateAsync(impersonatedUser);
wait_userManager.addClaimesync(模拟用户,新声明(“UserImpersonation”,“true”));
wait_userManager.addClaudeSync(模拟用户,新索赔(“OriginalUsername”,OriginalUsername));
返回重定向到操作(“索引”、“主页”);
}
有人使用过这种方法吗?使用
HttpContext.Authentication
public async Task<IActionResult> ImpersonateUserAsync(string userName) {
var context = HttpContext; //Property already exists in Controller
var originalUsername = context.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));
var authenticationManager = context.Authentication;
var cookie = DefaultAuthenticationTypes.ApplicationCookie;
await authenticationManager.SignOutAsync(cookie);
await authenticationManager.SignInAsync(cookie, impersonatedIdentity,
new AuthenticationProperties() { IsPersistent = false });
return RedirectToAction("Index", "Home");
}
公共异步任务ImpersonateSerAsync(字符串用户名){
var context=HttpContext;//控制器中已存在属性
var originalUsername=context.User.Identity.Name;
var impersonatedUser=await\u userManager.FindByNameAsync(用户名);
var impersonatedIdentity=await\u userManager.CreateAsync(impersonatedUser);
wait_userManager.addClaimesync(模拟用户,新声明(“UserImpersonation”,“true”));
wait_userManager.addClaudeSync(模拟用户,新索赔(“OriginalUsername”,OriginalUsername));
var authenticationManager=context.Authentication;
var cookie=DefaultAuthenticationTypes.applicationcokie;
等待authenticationManager.SignOutAsync(cookie);
等待authenticationManager.SignInAsync(cookie、impersonatedIdentity、,
新的AuthenticationProperties(){IsPersistent=false});
返回重定向到操作(“索引”、“主页”);
}
参考文档您是否意识到,
\u userManager.addclairsync
正在将模拟声明添加到数据库中,而不仅仅是添加到cookie中?因此,每次您使用此用户登录时,此模拟声明都将启用(除非您在取消模拟时将其从数据库中删除),这是一个很好的要点trailmax。正如您在链接中看到的,它们用于检测是否有人在进行模拟,并用于将用户反模拟回管理员权限。我应该在取消模拟时删除它们。谢谢。@trailmax没有意识到是你在链接中写了关于模仿的内容。嗨,特雷马克斯。这当然是一个极好的办法。但当涉及到.NETCore时,情况发生了变化<代码>登录不再接受var impersonatedIdentity
<代码>登录现在只能接受索赔
。有什么想法吗?谢谢Nkosi,我想HttpContext.Authentication
是一种方法,但是SignInAsync
无法获取impersonatedIdentity
,参数只能获取ClaimsPrincipal
。您是否能够对此进行任何解决方法?确定使用impersonatedIdentity
来确定标识操作是否成功。所以我不认为这行代码与SignInAsync
无关。因此,我的观点是,如何正确使用SignInAsync
登录(模拟)存储在AspNetUsers
表中的用户帐户?创建一个索赔原则,用必要的索赔填充它,然后在APSHP中签名我可以创建一个索赔清单var索赔
类似新索赔(ClaimTypes.Name,impersonatedUser.FirstName,ClaimValueTypes.String)
,新索赔(ClaimTypes.Email,impersonatedUser.Email,ClaimValueTypes.String)
并将其传递给ClaimsPrincipal
likevar user=newclaimsprincipal(新索赔实体(索赔,CookieAuthenticationDefaults.AuthenticationScheme))
但我相信这不是“实际上”以该用户帐户登录?看起来像是伪造的。我希望管理员实际以用户帐户登录,以便管理员可以跨页面查看该用户分配的权限。是不是\u userManager.CreateAsync
创建一个新用户?然后addsync
正在存储该新用户的声明?