首页 > 解决方案 > 如何在 .net core 中进行复杂的 2FA 身份验证

问题描述

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

首先这是我需要的:

  1. 谷歌登录(使用:.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,而是应该重定向到谷歌登录?

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

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

解决方案


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

由于您没有提到身份,我假设您没有使用它。我建议使用 .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


推荐阅读