C# ASP.NET Core 1.1用户身份模拟

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

在尝试使用.Net Core的标识实现用户模拟功能时遇到信息不足的问题。我试图在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()。身份验证
部分,其中我需要使用当前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
like
var user=newclaimsprincipal(新索赔实体(索赔,CookieAuthenticationDefaults.AuthenticationScheme))
但我相信这不是“实际上”以该用户帐户登录?看起来像是伪造的。我希望管理员实际以用户帐户登录,以便管理员可以跨页面查看该用户分配的权限。是不是
\u userManager.CreateAsync
创建一个新用户?然后
addsync
正在存储该新用户的声明?