Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC 5成员身份模拟特定用户_C#_Asp.net_Asp.net Mvc 5_Asp.net Identity - Fatal编程技术网

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中实现吗 有许

在c#中模拟用户的例子很多,但问题是你必须提供该用户的域、用户名和密码

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

  • 管理员
  • 使用者
  • 访客
以及属于不同角色的用户

现在,如果来自角色
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);