使用identity server4 做单点登录,登录成功后跳转到/signin-oidc得到404,纠结了很久,记录一下。
我这里的环境是vs2019和.net core3.0,用的Open ID Connect(OIDC)模式
id4是真的坑多,这个问题翻遍了网上的博客都没有找到想要的答案,尝试了很多种方法终于找到问题的地方。不过多坑一下对里边的流程和原理会更熟悉一点,只是这个过程太想让人砸手机了
先情景还原一下
访问需要登录的页面,如果还没有登录就跳转到授权中心,然后登录成功后跳转回来就一直这样了,并没有跳回到登录前的地址。
然后纠结了很久,网上也搜了很久都没有找到问题,这个过程就略过了。后面就想找一个可以正确跑得起来的例子,来对比一下,从跑得起来的例子看出来一个情况。
跳转到/signin-oidc后其实是做了一些操作的,有一个Cookies siged in,也就是访问/signin-oidc后程序做了解析,把登录成功后收到的信息解析出来存储到一个地方,并且进行了cookie的写入,下次访问的时候发现有cookie等信息就表示登录成功了。
大概的一个流程就是跳转到一个中间件验证权限,如果没有登陆就跳转到统一的登陆重中心,登陆后跳转回来。如果登陆了就直接通过验证,从token中取出来登陆携带的信息,方便用户取。
所以我猜测我那个跳转回来后报404的问题不是服务器的问题而是客户端的问题
因为已经成功跳转回来了,只是客户端解析的问题。所以我就尝试一下把那个可以成功跑起来的例子对接到我自己写的授权中心。
结论是可以的,说明就是客户端的问题,登录服务端没有问题。确定了哪里的问题后就相对容易一点了,于是就开始在客户端找问题,又是一阵折腾。
最后发现居然是少了一句:app.UseAuthentication()
太特么坑了,app.UseAuthentication()和UseAuthorization有点像啊,当时弄的时候以为有UseAuthentication了,结果仔细一看还是有区别的,
而且在3.0中这两个都必须要引入,如果只引入UseAuthentication的话就会报错。
而且,这两个的引入顺序不对也会报错!
要先引入UseAuthentication在引入UseAuthorization
如果顺序是反的,写成了这样
就会报死循环!一直循环不出来。
从上面的问题可以看出来app.UseAuthentication(),中间件必然有一个作用就是处理/signin-oidc,写入cookie!
我们下次来分析一下app.UseAuthentication()方法的源码
还有就是要注意客户端的services.AddAuthentication().AddCookie("Cookies").AddOpenIdConnect(.......)引用的包
.net core2.0本身自带了,但是3.0需要自己的引入,几个包都有这个方法注意不要引入错了。
我这里引用的是Microsoft.AspNetCore.Authentication.OpenIdConnect 3.0
而没有在客户端引入install-package IdentityServer4
最后附上两个例子的下载地址:
.net core2.0的identity server4单点登录
http://www.tnblog.net/resource/show/aojiancc2/1d5e5583310042fabd824ffffe24ddd8
.net core3.0的
http://www.tnblog.net/resource/show/aojiancc2/131cffe8fa874090970a57f9e258a873
欢迎加群讨论技术,群:677373950(满了,可以加,但通过不了),2群:656732739