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可以模拟任何用户,并以用户身份浏览/查看应用程序.这将使他们能够识别和解决应用程序中可能存在的问题.
现在,如果来自角色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)
您还应该制定一项政策,允许您在管理员模拟其帐户之前以某种方式获得用户的许可.