好的,所以这个请求有点令人费解。提前道歉。
首先,这就是我需要的:
.AddGoogle()
这是有效的)接下来,我认为我需要这样做:
使用services.AddAuthentication(...).AddCookie(...).AddGoogle()
。
所以我知道cookie会将过期时间嵌入到它的内容中,但我需要一些方法让它在会话到期时过期,并跟踪PIN是否已经过验证因此:
创建我自己的中间件,创建一个会话cookie(如果不存在),其中包含随机字符串或数字。
使用以下行为修改AddAuthentication中发生的任何事情:
让ASP.NET写出它的auth cookie,并将会话cookie的随机值加密到其中。
如果Cookie的嵌入过期时间未通过,则仅接受ASP.NET身份验证Cookie,并且auth cookie的嵌入式会话随机字符串与会话Cookie匹配。
如果cookie中没有记录PIN,请将ASP.NET身份验证重定向到PIN页面,然后在接受PIN并将其记录回身份验证cookie后将请求转发到相应的页面。
我的问题是我是否正确需要编写自己的中间件?我是否需要将AddAuthentication完全替换为我自己的中间件,还是可以通过制作自己的中间件来补充AddAuthentication正在做的事情来获得我需要的东西?
在尝试我遇到问题的其中一件事情是,如果我在验证之前在中间件中注销用户(当我检测到会话cookie丢失时),我就无法向身份验证机制发出信号重定向回谷歌登录,用户只是收到错误并且必须刷新。
此外,如果我走在正确的轨道上:我如何创建一个中间件,在创建之前将一个值注入到授权票证中;验证该值;并删除身份验证票证和/或向auth中间件发出信号,表明它不应处理存储在上下文请求中的cookie,而是应该重定向到google登录?
编辑:所以我试着自己做一些阅读。我正在关注OAuthHandlers并声称,也许有一些方法可以利用它?我还在调查,但欢迎任何方向。答案 0 :(得分:0)
通常说:您不应该编写自己的身份验证。
既然你没有提到身份,我会假设你没有使用它。我建议使用.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