作爲管理角色的成員想在我的ASP .NET Core Web應用程序中模擬另一個用戶。ASP .NET核心 - 以其他用戶身份登錄/模仿用戶和返回
基本上我想這樣做:
我知道我可以與其他用戶登錄:
await _signInManager.SignInAsync(appuser, false);
一個按鈕「回到我自己的帳戶」 - 我如何知道我目前正在冒充另一個用戶併爲我自己的帳戶提供「退款」。
這種情況下是否有內置方法?從ASP.NET Zero
作爲管理角色的成員想在我的ASP .NET Core Web應用程序中模擬另一個用戶。ASP .NET核心 - 以其他用戶身份登錄/模仿用戶和返回
基本上我想這樣做:
我知道我可以與其他用戶登錄:
await _signInManager.SignInAsync(appuser, false);
一個按鈕「回到我自己的帳戶」 - 我如何知道我目前正在冒充另一個用戶併爲我自己的帳戶提供「退款」。
這種情況下是否有內置方法?從ASP.NET Zero
採取
截圖我用下面的代碼解決了這個問題。
在的AccountController:
[Authorize(Roles="Administrators")]
public async Task<IActionResult> ImpersonateUser(string id)
{
var appUser = await _userManager.FindByIdAsync(id);
var userPrincipal = await _signInManager.CreateUserPrincipalAsync(appUser);
userPrincipal.Identities.First().AddClaim(new Claim("OriginalUserId", User.FindFirst(x=>x.Type == ClaimTypes.NameIdentifier).Value));
await _signInManager.SignOutAsync(); //sign out the current user
//https://github.com/aspnet/Identity/blob/dev/src/Microsoft.AspNetCore.Identity/IdentityCookieOptions.cs
await HttpContext.Authentication.SignInAsync("Identity.Application", userPrincipal); //impersonate the new user
return RedirectToAction("Index", "Home");
}
public async Task<IActionResult> StopImpersonation()
{
var originalUserId = User.Claims.First(x => x.Type == "OriginalUserId").Value;
var appUser = await _userManager.FindByIdAsync(originalUserId);
await _signInManager.SignInAsync(appUser, false);
return RedirectToAction("Index", "Home");
}
基本上,這增加了如權利要求OriginalUserId
到模擬的用戶。通過檢查此聲明是否存在,我知道我目前正在冒充,並可以使用StopImpersonation
中的代碼提供回原始帳戶的方式。
驗證方案Identity.Application
是默認設置。
好的解決方案!很高興我的博客幫助 – trailmax
不知道這是否會在Core中工作,但這就是我在Identity v2中所做的工作:http://tech.trailmax.info/2014/06/user-impersonation-with-asp-net-identity- 2 /我相信核心原則沒有大規模改變 – trailmax
@trailmax謝謝。這是正確的方向(請參閱我的回答) – Jetro223