比方說,我有以下作用:ASP.NET核心身份冒充特定的用戶
聯繫
用戶
我想管理員角色模仿與特定的用戶帳戶用戶角色,但不知道特定用戶帳戶的密碼。
管理員應該能夠模擬應用程序中的任何用戶,並能夠以用戶自己的身份瀏覽應用程序。 I found a link其中這實際上是在ASP.NET MVC 4.6中實現的,但在將其轉換爲Core版本時遇到一些麻煩。
晴的代碼鏈接
authenticationManager.SignIn(new AuthenticationProperties()
{ IsPersistent = false }, impersonatedIdentity);
凡在.NET核心SignIn
參數不允許IdentityResult
類(impersonatedIdentity)再被傳遞的最後一行的原因。現在只能拿ClaimsPrincipal
。
所以我落得這樣做這個,
public async Task<IActionResult> ImpersonateUserAsync(string userName)
{
var impersonatedUser = await _userManager.FindByNameAsync(userName);
var claims = new List<Claim> {
new Claim(ClaimTypes.Name, impersonatedUser.FirstName, ClaimValueTypes.String),
new Claim(ClaimTypes.Surname, impersonatedUser.LastName, ClaimValueTypes.String),
new Claim(ClaimTypes.Email, impersonatedUser.Email, ClaimValueTypes.String)
};
var user = new ClaimsPrincipal(new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme));
var authenticationManager = _httpContextAccessor.HttpContext.Authentication;
await authenticationManager.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
await authenticationManager.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, user, new AuthenticationProperties() { IsPersistent = false });
return RedirectToAction("Index", "Home");
}
我填寫必要的索賠,並將其傳遞給ClaimsPrincipal
所以SignInAsync
現在可以採取var user
。 但是,這好像是我實際上沒有登錄,因爲用戶在AspNetUsers
表中找到的用戶具有以前由管理員角色分配的角色和特權。說實話,我期待上面的代碼至少可以登錄到var claims
中定義的名稱和姓氏,但事實上,我仍然以管理員帳戶登錄後,我被重定向到索引頁面。
爲了以AspNetUsers
表中定義的用戶帳戶登錄,我需要採取哪些適當步驟,以便Admin能夠以用戶自己的身份瀏覽應用程序?
首先,非常小心地實施這種功能,因爲它可能會使您承擔法律責任,尤其是在您處理信用卡信息或健康信息時。其次,您需要提供一些審計功能,指示用戶已被模擬,以便可以證明它是否是模擬用戶的真正用戶做了某事。 –
感謝您的建議,但我們已經與客戶達成了協議,請不要擔心。任何想法/方法來解決這個問題? – pavilion
你有沒有嘗試過這裏的解決方案:https://stackoverflow.com/a/42059249/61164 - 請注意,這使用SigninManager,而不是AuthenticationManager。 –