ASP.NET MVC 5成员身份模拟特定用户

Dav*_*ury 9 c# asp.net asp.net-mvc-5 asp.net-identity

有许多关于在c#中模拟用户的示例,但问题是您必须提供该用户的域,用户名和密码.

我需要的是有点不同.如果我们使用成员资格在ASP.NET MVC 5中构建应用程序,我们假设我们具有以下角色:

  • 管理员
  • 用户
  • 游客

和属于不同角色的用户.

现在,如果角色中的用户User对应用程序有一些问题,我如何允许Admin角色中的用户模拟该特定用户,而没有该特定用户向管理员提供他的用户名和密码?

最重要的是,它Admin应该能够模仿应用程序中的任何用户,并能够以用户自己的身份浏览应用程序.

这可能在MVC中实现吗?

有许多应用程序提供这种可能性,其中之一是Salesforce.Salesforce中的Admin可以模拟任何用户,并以用户身份浏览/查看应用程序.这将使他们能够识别和解决应用程序中可能存在的问题.

dan*_*wig 6

现在,如果来自角色User的用户对应用程序有一些问题,我如何允许来自Admin角色的用户模拟该特定用户,而没有该特定用户向管理员提供他的用户名和密码?......这可能在MVC中实现吗?

这可以在不知道要模拟的用户的密码的情况下完成,但您必须知道要模拟的用户的用户名.

您可以使用常规表单身份验证执行以下操作:

FormsAuthentication.SetAuthCookie("username-to-be-impersonated", false);
Run Code Online (Sandbox Code Playgroud)

当然,您可能希望保护此代码块的条目,以便只有管理员才能进行模拟.您可能希望执行其他操作,例如在会话或cookie中保存管理员用户的用户名,以帮助系统知道模拟正在进行中,并让用户在模拟完成时将其撤消.

最重要的是,所有会员系统关心的是auth cookie,您可以在不知道用户密码的情况下为任何用户名编写auth cookie.

对于ASP.NET Identity 2,该过程是相同的,区别在于您如何编写auth cookie.请注意,下面的代码是基于@trailmax在OP中留下的评论的片段:

// assume you already have references to a UserManager and HttpContext
var userToImpersonate = await userManager
    .FindByNameAsync(userNameToImpersonate);
var identityToImpersonate = await userManager
    .CreateIdentityAsync(userToImpersonate,   
        DefaultAuthenticationTypes.ApplicationCookie);
var authenticationManager = httpContext.GetOwinContext().Authentication;
authenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
authenticationManager.SignIn(new AuthenticationProperties()
{
    IsPersistent = false
}, identityToImpersonate);
Run Code Online (Sandbox Code Playgroud)

您还应该制定一项政策,允许您在管理员模拟其帐户之前以某种方式获得用户的许可.