我已经设置了具有常规身份验证的标准ASP.NET MVC网站。我已经添加了角色,因此新用户将获得特定的角色。

现在,我希望能够模拟一个用户。

模拟建议

当我四处搜寻时,冒用以下方法即可进行模拟:

     FormsAuthentication.SetAuthCookie(user.UserName, false);

默认情况下,这是行不通的,因为您必须做两件事:

1:

启用表单例份验证:
 <system.web>
    <authentication mode="Forms" />
  </system.web>

2:

禁用模块:
<system.webServer>
    <modules>
      <!--<remove name="FormsAuthentication" />-->
    </modules>
    <staticContent>

挑战

但是,这样做会带来一些挑战。
  • 模拟时,您无法注销。这很容易解决
    在注销中添加以下内容:FormsAuthentication.SignOut();
  • User.IsInRole(Constants.Roles.Creditor);停止工作,因此
    我们无法检查用户是否具有
  • 角色

    怎么办?

    这可能归结为我-显然-尽管尝试了,但仍未完全了解成员(member)资格框架。但是,您如何冒充在这里工作?

    我没有明确的理由使用“表单”身份验证,而我在此路径上启动的唯一原因是模拟。所以我看到我有两个明显的方向:
  • A)以其他方式实现模拟,因此我不会碰我的
    web.config使用表单
  • B)修复
  • 表单中的角色问题

    这里有什么帮助吗? :-)

    最佳答案

    有很多方法可以完成此操作,您真正需要做的就是将ID都获取到 Controller ,并确定您希望其持久化的方式(Cookie,Cache,Db等)。

    一种简单的方法是为模拟创建 claim ,并为此类 claim 添加策略。这是用于添加基于声明的策略的链接。

    这是一些使您入门的代码:

    在您的 Controller 中,您将需要一个执行以下操作的端点

            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);
            }
    

    现在,使用上面的代码,我们需要用户ID,但是我们可以很容易地到达该角色,并将其保存在声明中。在这里,您只需要决定如何使用此声明即可。下面的链接将向您展示如何做到这一点。

    https://docs.microsoft.com/en-us/aspnet/core/security/authorization/claims

    只要记住,请在完成后删除 claim 。

    当您可能需要假冒用户一段时间时,此功能非常有用。我为客户服务的一个项目需要能够模拟几个星期的用户才能完成其他客户的工作。

    关于c# - 模拟标准ASP.NET MVC安装模板中的用户,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47816203/

    10-17 00:11