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

时间:2015-02-07 11:10:56

标签: c# asp.net asp.net-mvc-5 asp.net-identity

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

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

  • 管理
  • 用户
  • 访问者

和属于不同角色的用户。

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

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

这可以在MVC中实现吗?

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

3 个答案:

答案 0 :(得分:6)

  

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

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

您可以使用普通的表单身份验证执行以下操作:

FormsAuthentication.SetAuthCookie("username-to-be-impersonated", false);

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

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

ASP.NET Identity 2的过程相同,区别在于您编写auth cookie的方式。请注意以下代码为a snippet based on the comment that @trailmax left in the 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);

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

答案 1 :(得分:3)

我不认为解决方案在于会员制度本身。我可能会在应用程序逻辑中实现模拟。会员系统会告诉您用户的身份以及他们拥有的角色,但您的应用程序可以随意忽略或解释这些角色。

编辑:详细说明......

您可以将此视为成员资格的问题,而不仅仅是应用程序中内置的一组功能。管理员可以通过成为管理员来查看用户看到的内容 - 这是构建到应用程序逻辑中的。

尝试将此功能破解到会员系统中,以便应用程序以某种方式被欺骗,将管理员视为一个不同的成员似乎很苛刻 - 任何对会员系统的滥用都会打开安全漏洞。

如果你真的想沿着这条路走下去,或许你应该考虑给管理员提供与他们的IP地址相关的短期代币,例如10分钟让他们以任何人的身份登录 - 再次,这与会员资格无关 - 它& #39;绑定到密码检查,你可以分解出来。

所以我并没有在这里提供解决方案 - 只是建议不要在黑客入侵会员系统时找到它。如果你这样做,那么你削弱了会员系统的安全性,但你也限制了你可以实现的目标。例如,您可能希望向管理员显示用户看到的内容+诊断的一些额外信息 - 如果应用程序认为管理员是用户,这将如何工作?

答案 2 :(得分:0)

我所做的只是在会话中传递当前用户ID并在整个应用程序中读取会话。如果当前登录的用户与会话对象不同,我知道正在进行模拟。我在会话启动时将所有这些设置在global.asax文件中。似乎适用于我的应用程序。

相关问题