0

比方說,我有以下作用:ASP.NET核心身份冒充特定的用戶

  1. 聯繫

  2. 用戶

我想管理員角色模仿與特定的用戶帳戶用戶角色,但不知道特定用戶帳戶的密碼。

管理員應該能夠模擬應用程序中的任何用戶,並能夠以用戶自己的身份瀏覽應用程序。 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能夠以用戶自己的身份瀏覽應用程序?

+0

首先,非常小心地實施這種功能,因爲它可能會使您承擔法律責任,尤其是在您處理信用卡信息或健康信息時。其次,您需要提供一些審計功能,指示用戶已被模擬,以便可以證明它是否是模擬用戶的真正用戶做了某事。 –

+0

感謝您的建議,但我們已經與客戶達成了協議,請不要擔心。任何想法/方法來解決這個問題? – pavilion

+1

你有沒有嘗試過這裏的解決方案:https://stackoverflow.com/a/42059249/61164 - 請注意,這使用SigninManager,而不是AuthenticationManager。 –

回答

0

在Asp.Net Core HERE有一篇關於冒充的博客文章。我只是在尋找這樣的解決方案,所以我還沒有嘗試過實施它。不過看起來你正走在正確的軌道上。你的代碼和Max的代碼只有細微的差別。

基本上你需要在瀏覽器端替換cookie。因此,對於下一個請求,服務器「認爲」其他人登錄。至少這是我迄今爲止所瞭解的。這就是爲什麼您更好地將原始身份保存在Cookie中的原因,因此您可以在需要時切換回原始用戶。

無論如何,當我有工作解決方案時,我會回來。

相關問題