0

のは、私は次のような役割を持っているとしましょう:ASP.NETコアアイデンティティ特定のユーザーを偽装

  1. 管理

  2. ユーザー

私は管理者の役割が持つ特定のユーザーアカウントを偽装したいです特定のユーザーアカウントのパスワードを知らないユーザーの役割。

管理者は、アプリケーションからすべてのユーザーを偽装し、ユーザー自身としてアプリケーションを参照できるようにする必要があります。 I found a linkこれは実際にはASP.NET MVC 4.6で実装されていますが、これをコアバージョンに変換する際に少し頭痛があります。主な理由は、.NETのコアでSignInパラメータがIdentityResultクラス(impersonatedIdentityは)もう渡すことを許可していませんリンク

authenticationManager.SignIn(new AuthenticationProperties() 
{ IsPersistent = false }, 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"); 
    } 

私は必要な主張を埋めのでSignInAsyncは今var userを取ることができClaimsPrincipalにそれを渡されました。 しかし、これは、以前は管理者ロールによって割り当てられたロールと特権を持つテーブルAspNetUsersにあるユーザーとして実際にログインしていないようです。正に言えば、上記のコードが少なくともvar claimsで定義した名前と姓のようにサインインすることを期待していましたが、実際にはインデックスページにリダイレクトされた後でも管理者アカウントとしてログインしています。

AspNetUsersテーブルに定義されているユーザーアカウントにサインインするために必要な適切な手順は何ですか。管理者はユーザー自身でアプリケーションを閲覧できますか?

+0

まず、この種の機能の実装には特に注意が必要です。これは、特にクレジットカード情報や健康情報を取り扱う場合、法的責任を問われる可能性があるためです。次に、ユーザーが偽装されたことを示す監査機能を提供する必要があります。そのため、ユーザーが何かを行った偽装ユーザーの実際のユーザーであることが証明できます。 –

+0

あなたのアドバイスをありがとうが、私たちはすでにクライアントと契約を結んでいたので、心配しないでください。ここで問題を解決するためのアイデアやアプローチはありますか? – pavilion

+1

解決策を試したことがありますか?https://stackoverflow.com/a/42059249/61164 - AuthenticationManagerではなくSigninManagerを使用しています。 –

答えて

0

Asp.Net Core HEREに偽装に関するブログ記事があります。私はそのようなソリューションを探しているだけなので、まだ実装しようとしていません。しかし、それは正しい軌道に乗っているようです。あなたのコードとMaxの間にはわずかな違いしかありません。

基本的にブラウザ側でCookieを置き換える必要があります。ですから、次のリクエストでは、サーバは他の誰かがログインしたと思っています。少なくともこれは私がこれまで理解していたものです。このため、元のIDをクッキーに保存したほうがよいので、必要に応じて元のユーザーに戻すことができます。

私はとにかく実際のソリューションを持っています。

関連する問題