C# ASP.NET MVC 5成员身份模拟特定用户
在c#中模拟用户的例子很多,但问题是你必须提供该用户的域、用户名和密码 我需要的是一点不同。如果我们在ASP.NET MVC 5中使用成员身份构建应用程序,那么假设我们有以下角色:C# ASP.NET MVC 5成员身份模拟特定用户,c#,asp.net,asp.net-mvc-5,asp.net-identity,C#,Asp.net,Asp.net Mvc 5,Asp.net Identity,在c#中模拟用户的例子很多,但问题是你必须提供该用户的域、用户名和密码 我需要的是一点不同。如果我们在ASP.NET MVC 5中使用成员身份构建应用程序,那么假设我们有以下角色: 管理员 使用者 访客 以及属于不同角色的用户 现在,如果来自角色user的用户对应用程序有一些问题,我如何允许来自Admin角色的用户模拟该特定用户,而不允许该特定用户向管理员提供其用户名和密码 最重要的是,管理员应该能够模拟应用程序中的任何用户,并且能够以用户自己的身份浏览应用程序 这可以在MVC中实现吗 有许
- 管理员
- 使用者
- 访客
user
的用户对应用程序有一些问题,我如何允许来自Admin
角色的用户模拟该特定用户,而不允许该特定用户向管理员提供其用户名和密码
最重要的是,管理员
应该能够模拟应用程序中的任何用户,并且能够以用户自己的身份浏览应用程序
这可以在MVC中实现吗
有许多应用程序提供了这种可能性,其中之一就是Salesforce。Salesforce中的管理员可以模拟任何用户,并以用户本人的身份浏览/查看应用程序。这将允许他们识别并解决应用程序中可能出现的问题。我认为解决方案不在于会员制本身。我可能会在应用程序逻辑中实现模拟。成员资格系统告诉您用户的身份以及他们所扮演的角色,但是您的应用程序可以随意忽略或解释这些角色 编辑:详细说明 您可以将其视为应用程序内置的一组功能,而不是成员资格问题。管理员只需作为管理员,就可以看到用户看到的东西——这是应用程序逻辑的内置部分 试图将此功能侵入会员系统,使应用程序不知何故被愚弄,将管理员视为不同的会员,这似乎是黑客行为——任何滥用会员系统的行为都会打开安全漏洞 如果你真的想走这条路,也许你应该考虑给管理员提供与他们的IP地址绑定的短期令牌,比如10分钟,让他们以任何人的身份登录-同样,这与成员资格无关-这与密码检查有关,你可以将其考虑在内 因此,我并不是在这里给出一个真正的解决方案——只是建议在黑客攻击底层会员系统时不会找到它。如果你这样做,那么你就削弱了会员制度的安全性,但也限制了你的成就。例如,您可能希望向管理员显示用户看到的内容+一些额外的诊断信息-如果应用程序认为管理员是用户,这将如何工作 现在,如果来自角色用户的用户在应用程序中有一些问题,如何解决 我是否可以允许管理员角色的用户模拟该特定用户, 没有特定的用户给管理员他的用户名和密码 密码。。。这可以在MVC中实现吗 这可以在不知道要模拟的用户密码的情况下完成,但是您必须知道要模拟的用户的用户名 您可以使用普通表单身份验证通过以下方式执行此操作:
FormsAuthentication.SetAuthCookie("username-to-be-impersonated", false);
当然,您希望保护此代码块的条目,以便只有管理员可以进行模拟。您可能需要执行其他操作,如在会话或cookie中保存管理员用户的用户名,以帮助系统知道正在进行模拟,并让用户在完成模拟时能够反转模拟
底线是,会员制关心的只是身份验证cookie,您可以为任何用户名编写身份验证cookie,而不需要知道用户的密码
ASP.NET Identity 2的过程是相同的,不同之处在于如何编写身份验证cookie。注:以下代码为:
您还应该有一个策略,允许您在管理员模拟其帐户之前以某种方式获得用户的权限。我所做的就是在会话中传递当前用户id,并在整个应用程序中读取会话。如果当前登录的用户与会话对象不同,我知道正在进行模拟。我在会话开始时在global.asax文件中设置了所有这些。似乎对我的应用程序很有用。你能详细说明一下你的答案吗?我不同意这可能是黑客行为,如果做得正确,也不会削弱会员系统的安全性。有时,这样一个功能非常有助于准确地看到其他非管理员用户看到的内容。如果你有用户名或用户id的操作,这是必要的,因为通常没有一个好的方法向具有不同用户名或用户id的管理员用户打开这些操作。请参阅我的博文:MVC真的与此无关。MVC只使用HttpContext.Current.Identity全局值中当前的任何用户。你所要做的就是按照你为其他用户设置密码的方式重置密码,如果他们已经是管理员,就不用麻烦检查密码了。但是,我要提醒您,这样做可能违反法律,或在遵守各种法规或政策(如HIPPA、PCI、萨班斯-奥克斯利法案等)方面产生问题。。。在你做这件事之前先和律师商量一下。听起来不错!当然,要求有点复杂,所有的模拟都将通过检查管理员是否真的是管理员来正确完成,另一件事是,如果没有用户权限,管理员将无法模拟用户。基本上是这样的:
我是这个应用程序的用户,我有一个问题!我允许管理员角色模拟我并检查/查看我能看到的问题!管理员角色用户然后可以模拟该特定用户。用户可以取消模拟权限,并可以设置模拟的日期和时间,如仅在接下来的4小时内进行模拟。
@DavidDury那么听起来您好像
// 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);