Lar*_*ard 4 .net c# asp.net-mvc asp.net-membership asp.net-mvc-5
我已经设置了具有正常身份验证的标准ASP.NET MVC站点.我添加了角色,因此新用户可以获得特定的角色.
现在,我希望能够冒充用户.
假冒建议
当我搜索时,冒充来自以下方式:
FormsAuthentication.SetAuthCookie(user.UserName, false);
Run Code Online (Sandbox Code Playgroud)
这在默认情况下不起作用,因为您必须做两件事:
1:
启用表单身份验证
<system.web>
<authentication mode="Forms" />
</system.web>
Run Code Online (Sandbox Code Playgroud)
2:
禁用模块:
<system.webServer>
<modules>
<!--<remove name="FormsAuthentication" />-->
</modules>
<staticContent>
Run Code Online (Sandbox Code Playgroud)
挑战
但是,这样做会带来一些挑战.
FormsAuthentication.SignOut();User.IsInRole(Constants.Roles.Creditor);停止工作,所以我们不能在角色检查用户是否该怎么办?
这个可能归结为我 - 显然 - 尽管尝试了,但还没有完全理解会员框架.但是,你如何冒充在这里工作?
我没有明确的理由使用"表单"身份验证,我开始使用此路径的唯一原因是模拟.所以我看到我有两个明显的方向:
这里有什么帮助?:-)
有很多方法可以实现这一点,你真正需要做的就是将你的ID同时送到你的控制器并决定你想要它的持久性(Cookie,Cache,Db等).
一种简单的方法是为模拟创建声明并为这类声明添加策略.以下是添加基于声明的政策的链接.
以下是一些可以帮助您入门的代码:
在您的控制器中,您将需要一个类似于此的终点
var claims = await UserManager.GetClaimsAsync(CurrentUserId);
var claim = claims.FirstOrDefault(c => c.Type == "Impersonate");
if (claim!=null)
{
//You may forget to remove it or the user could end there session before you are able to
var r = await UserManager.RemoveClaimAsync(CurrentUserId, claim);
}
var result = await UserManager.AddClaimAsync(CurrentUserId, new Claim("Impersonate", userId));
if (!result.Succeeded)
{
return GetErrorResult(result);
}
Run Code Online (Sandbox Code Playgroud)
现在使用上面的代码,我们需要用户ID,但我们可以轻松地获得角色并将其与声明一起保存.从这里您只需要决定如何使用此声明.以下链接将向您展示如何做到这一点.
https://docs.microsoft.com/en-us/aspnet/core/security/authorization/claims
请记住在完成后删除声明.
当你可能不得不冒充一段时间时,这个很好用.我在客户端工作的一个项目,需要能够一次模仿用户数周,以完成其他客户的工作.
| 归档时间: |
|
| 查看次数: |
650 次 |
| 最近记录: |