在ASP.NET Identity应用程序中留下后门的最佳方法是什么?

时间:2019-07-26 09:06:31

标签: asp.net asp.net-mvc security asp.net-identity .net-security

我是公司内部客户端系统的开发人员,在某些情况下,我必须使用用户帐户登录系统以检查错误或其他内容。由于密码是加密的,所以我不能只在数据库中查找密码并获得访问权限。

我发明的最好的方法是使用?heyThisIsAdmin=soJustLetMeInWithoutAnyPasswords之类的查询参数标志,该标志允许我输入任何密码并登录。

但是我非常了解安全问题。您能为我提供一些实现我想要的但更健壮和安全的方法的建议吗?

2 个答案:

答案 0 :(得分:1)

正如您所说,您提出的解决方案根本不安全,因为任何人都会阅读代码或知道秘密会使用魔术查询字符串来使用此超级功能。

一个更好的解决方案是在客户端平台上创建一个帐户,但是上面带有一个特殊标志,可以模拟用户帐户(或仅查看他们看到的内容)。这种机制当然需要一些发展。

请注意,即使采用这种解决方案,也只能在您已经登录后才能完成。为了提高安全性,您还可能需要第二项身份验证(电子邮件,SMS,TOTP ...)

您需要在这里查看要实现的目标,作为应用的功能,而不是后门。您应该能够向任何人解释它的工作原理,而无需暴露您的应用程序。因为它的优势在于:

  • 您的密码
  • 您的第二个因素
  • 您的帐户中设置了THE标志的事实

答案 1 :(得分:0)

ASP可以通过模拟来处理此问题。您将需要实现设置和禁用渗透的方法。

我实现此方法的方式是仅使用[Authorize]属性装饰SetImpersonation操作,以仅允许Admin用户角色来模拟用户。

以下是MVC的示例:

设置模拟

const columns = [
      {
        name: 'Title',
        selector: 'title',
        sortable: true,
        cell: row => <div style={{fontSize: 25}}>{row.title}</div>
      }]

并还原模拟(被模仿的用户需要执行此操作)

  [Authorize(Roles = (AccountController.Permissions.SUPER_USER))]
    public ActionResult ImpersonateUser(string userName)
    {
        string originalUsername = LoggedInUser.Email;

        ApplicationUser impersonatedUser = UserManager.FindByNameAsync(userName).Result;

        var impersonatedIdentity = UserManager.CreateIdentityAsync(impersonatedUser, DefaultAuthenticationTypes.ApplicationCookie).Result;
        impersonatedIdentity.AddClaim(new Claim("UserImpersonation", "true"));
        impersonatedIdentity.AddClaim(new Claim("OriginalUsername", originalUsername));

        AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
        AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = false }, impersonatedIdentity);

        return RedirectToAction("Index", "Home");
    }