繁体   English   中英

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

[英]ASP.NET MVC 5 Membership impersonate specific user

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

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

  • 管理员
  • 用户
  • 游客

和属于不同角色的用户。

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

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

这可能在MVC中实现吗?

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

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

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

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

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

当然,您可能希望保护此代码块的条目,以便只有管理员才能进行模拟。 您可能希望执行其他操作,例如在会话或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);

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

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

编辑:详细阐述......

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

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

如果你真的想沿着这条路走下去,或许你应该考虑给管理员提供与他们的IP地址绑定的短期令牌,比如10分钟让他们像任何人一样登录 - 再次这与会员资格无关 - 它与密码检查有关你可以分解出来。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM