2016-10-28 9 views
2

管理役割のメンバーは、ASP .NETコアWebアプリケーション内の別のユーザーを偽装する必要があります。ASP .NETコア - 他のユーザー/偽装ユーザーとしてサインインして戻す

基本的に私はこれをしたい:

login as another user

私は私が別のユーザーとしてログインできることを知っている:ボタンについて

await _signInManager.SignInAsync(appuser, false); 

「バック自分のアカウントに移動します」 - どうすればいいですか私は現在、別のユーザーになりすまして自分のアカウントに「帰り道」を提供しています。

このシナリオには、組み込みのメソッドがありますか?

go back to my account

ASP.NET Zero

+1

これがCoreで動作するかどうかはわかりませんが、これはID v2でどのように行ったのですか。http://tech.trailmax.info/2014/06/user-impersonation-with-asp-net-identity- 2 /私はコアの原則は大規模に変更されていないと確信しています – trailmax

+0

@ trailmaxありがとうございます。これは正しい方向だった(私の答えを参照) – Jetro223

答えて

3

から取られたスクリーンショット私は、次のコードでそれを解決しました。 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がデフォルトです。

+0

良い解決策!喜んで私のブログは助けた – trailmax

関連する問題