【发布时间】:2018-05-04 20:50:40
【问题描述】:
好的,所以这个请求有点复杂。提前道歉。
首先这是我需要的:
- Google 登录(使用:
.AddGoogle()并且有效) - 在最初登录后,将用户推送到另一个页面,他们必须在其中输入 PIN。
- 在后端的数据库中验证该 PIN。如果不匹配,则返回用户再次输入 PIN。
- 验证 PIN 后,允许完全访问该网站(不包括输入 PIN 页面)。
- 在 X 分钟不活动后(或如果浏览器关闭)立即注销用户。
接下来,这是我认为我需要做的:
-
使用
services.AddAuthentication(...).AddCookie(...).AddGoogle()。所以我知道 cookie 将在其内容中嵌入过期时间,但我需要一些方法使其在会话过期时也过期,并跟踪 PIN 是否已经过验证,因此:
创建我自己的中间件,用于创建会话 cookie(如果不存在),其中包含随机字符串或数字。
-
使用以下行为修改 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