【问题标题】:New Authentication-System from ASP.NET Core 1.0 (aka ASP.NET 5)来自 ASP.NET Core 1.0(又名 ASP.NET 5)的新身份验证系统
【发布时间】:2016-02-18 02:10:35
【问题描述】:

我仍在尝试修补新的 ASP.NET Core MVC6(以前的 vNext)。这次我尝试针对 Active Directory 而不是实体框架数据库来实现我的身份验证。 由于我发现的文档太少,所以我采用了非常出色的 ASP.NET-Template 并开始根据我的需要对其进行修改。 我还使用 ReSharper 来反编译 Parts,因为我对 Details 非常感兴趣。

为了不深入细节,我有点担心我做的不是微软想要的: 我保留了SignInManager,并删除了UserManager,因为

return await _signInManager.PasswordSignInAsync(model.UserName, model.Password, false, false);

内部调用UserManager。现在它变得相当棘手:为了提供实体框架的替代存储,我需要实现

IUserPasswordStore<ApplicationUser>

其中有大约 15 种方法,其中大多数似乎从未被我简单的登录检查调用过。 此外,我还需要实现

IRoleStore<IdentityRole>

还有另外 10 种方法,虽然我现在什至不想要基于角色的安全性!

另外,密码的验证确实需要哈希,这里是反编译的方法:

protected virtual async Task<PasswordVerificationResult> VerifyPasswordAsync(IUserPasswordStore<TUser> store, TUser user, string password)
{
  string hashedPassword = (string) await store.GetPasswordHashAsync(user, this.CancellationToken);
  return hashedPassword != null ? this.PasswordHasher.VerifyHashedPassword(user, hashedPassword, password) : PasswordVerificationResult.Failed;
}

根据其他 SO-Threads,没有办法获取 AD 的密码,所以我也无法正确实现。

我认为要走的路也是覆盖SignInManager,但这似乎会获得相当多的代码,甚至不需要。另外 2 个 Store-Interfaces 似乎对 SOLID 造成了很大的伤害,因为接口太大了。

我是不是有什么根本性的错误?

【问题讨论】:

  • ASP.NET Core 是开源的,所以我不知道你为什么要反编译来理解它。话虽这么说,我真的不明白你在问什么。
  • 如果要使用 AD 帐户实现 Windows 身份验证,请检查 this question
  • @poke:感谢您的反馈,我正在尝试在没有 EF 的情况下使用 AD 来实施新的安全系统。我还需要一个 Login-Site 和一个 AccountController,而不仅仅是 AuthorizationPolicy。我的问题基本上是,如何正确实施这一点,因为所需的实施量告诉我,我做错了。通常我不会问那么宽泛的问题,但我搜索了很长时间并没有找到任何提示。
  • 您需要帐户控制器做什么? Windows 身份验证是隐式的; Windows 身份验证没有“输入您的密码,我会根据 AD 进行检查”之类的东西。

标签: c# asp.net-core asp.net-core-mvc


【解决方案1】:

我们不提供 AD 版本的原因是安全性。

通过实施一个,您现在可以让 AD 对暴力攻击开放,因为您没有禁用帐户(因为这可能需要管理员权限,并且没有人应该以域管理员身份运行他们的 Web 应用程序),或者您禁用帐户,现在,通过一些请求,我可以将您的用户锁定在 AD 之外,这不仅会影响您的网络应用,还会影响他们的桌面计算机。

现在补充一点,如果发生违规行为,我现在已通过您的 AD 身份验证,这将使攻击者高兴,但不会让您的网络管理员高兴。

顺便说一句,密码检查不需要散列密码,只需在 VerifyPasswordAsync 中针对 AD 进行身份验证并返回适当的结果。

如果您只在 Intranet 环境中运行,我的建议是查看集成身份验证,或者如果您想在云中运行,则查看 Windows Azure AD。与尝试将 AD 用于基于 HTML 表单的方案相比,这两者都明显更安全。

【讨论】:

  • 非常感谢,看起来很合理。但是覆盖这个Stores,离开Managers,是你推荐的方法吗,即使Stores也有这么多的Methods?
  • 老实说,我会走手动路线并完全避免身份。您不希望通过网络重置密码、组管理或任何开销。更糟糕的是,当您将身份写入 cookie 时,它​​不会更改,直到 cookie 过期。因此,如果您从 AD 中的组中删除某人,您的网络应用程序仍会看到他们在其中。
  • 好吧,我仍然需要 User 字段,只是为了显示一个简单的“Hello Matthias”并授权控制器。看来我需要在这里找到一些中间立场。但是你给了我一些很好的提示,非常感谢。
  • Windows Azure AD 将支持这一点。但是,我担心这当然会涉及成本。
猜你喜欢
  • 1970-01-01
  • 2021-05-31
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
  • 2018-06-25
  • 2016-05-19
  • 2018-05-13
相关资源
最近更新 更多