【问题标题】:How to do a complicated 2FA authentication in .net core如何在 .net core 中进行复杂的 2FA 身份验证
【发布时间】:2018-05-04 20:50:40
【问题描述】:

好的,所以这个请求有点复杂。提前道歉。

首先这是我需要的:

  1. Google 登录(使用:.AddGoogle() 并且有效)
  2. 在最初登录后,将用户推送到另一个页面,他们必须在其中输入 PIN。
  3. 在后端的数据库中验证该 PIN。如果不匹配,则返回用户再次输入 PIN。
  4. 验证 PIN 后,允许完全访问该网站(不包括输入 PIN 页面)。
  5. 在 X 分钟不活动后(或如果浏览器关闭)立即注销用户。

接下来,这是我认为我需要做的:

  1. 使用services.AddAuthentication(...).AddCookie(...).AddGoogle()

    所以我知道 cookie 将在其内容中嵌入过期时间,但我需要一些方法使其在会话过期时也过期,并跟踪 PIN 是否已经过验证,因此:

  2. 创建我自己的中间件,用于创建会话 cookie(如果不存在),其中包含随机字符串或数字。

  3. 使用以下行为修改 AddAuthentication 中发生的任何事情:

    让 ASP.NET 写出它的身份验证 cookie,并在其中加密会话 cookie 的随机值。

    仅当 cookie 的嵌入过期时间尚未过去且 auth cookie 的嵌入会话随机字符串与会话 cookie 匹配时,才接受 ASP.NET auth cookie。

    如果 cookie 中没有记录 PIN,则让 ASP.NET auth 重定向到 PIN 页面,然后在 PIN 被接受并记录回 auth cookie 后将请求转发到适当的页面。

我的问题是我需要编写自己的中间件是否正确?我是否需要用我自己的中间件完全替换 AddAuthentication,或者我是否可以通过制作自己的中间件来补充 AddAuthentication 已经在做的事情来获得我需要的东西?

在试验我遇到的问题之一是,如果我在身份验证之前注销中间件中的用户(当我检测到会话 cookie 丢失时)我无法向身份验证机制发出信号以重定向回谷歌登录,而用户只是收到一个错误,必须刷新。

此外,如果我走在正确的轨道上:如何创建一个中间件,在创建之前将值注入到身份验证票中;验证该值;并删除 auth ticket cookie 和/或向 auth 中间件发出信号,它不应该处理存储在上下文请求中的 cookie,而是应该重定向到 google 登录?

编辑:所以我试着自己做一些阅读。我正在查看 OAuthHandlers 和声明,也许有一些方法可以利用它?我仍在调查,但欢迎任何方向。

【问题讨论】:

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


    【解决方案1】:

    正如通常所说:您不应该编写自己的身份验证。

    由于您没有提到 Identity,我假设您没有使用它。我建议使用 .Net 的 Identity,因为它可以轻松解决您遇到的问题。从 Identity 2.0 开始,外部登录(Facebook、Twitter、Google)和 2FA 功能都包含在这个库中。这是.Net事实上的身份验证系统,添加它并不太难。

    Identity 的实际实现超出了问题的范围,所以这里有一个链接可以帮助您入门:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity?view=aspnetcore-2.1&tabs=visual-studio%2Caspnetcore2x

    【讨论】:

    • 您可以从services.AddAuthentication() 推断出他已经在使用身份,但也许他应该这样标记问题。他应该看看How SignInManager checks for 2FA requirement
    • 抱歉,伙计们,我不清楚这个答案在说什么。你是说如果我使用 Identity,我可以注入额外的数据库支持的 PIN 吗?
    • 我想我明白你在说什么。我想我可能还不够清楚。我不想使用带有 SMS 或计算代码的典型 2FA,而是使用未链接到 google 登录的额外 PIN。这是应用程序的要求。有没有办法通过身份和默认身份验证机制来实现这一点?
    猜你喜欢
    • 2020-06-16
    • 1970-01-01
    • 2019-04-24
    • 2020-11-15
    • 1970-01-01
    • 2018-12-13
    • 2018-12-17
    • 2020-10-28
    • 2020-10-15
    相关资源
    最近更新 更多