IdentityServer4前后端分离验证(即前端提供登陆、登出等页面,后端提供相应的接口)的一些坑
前言
最近刚把个人博客的主要功能模块写完了,想把IdentityServer4引入,准备基于IdentityServer4+EF+Identity来实现一套前后端分离的身份验证授权的管理系统(即使用Vue写登陆页面以及IdentityServer4的相关资源管理页面,然后后端提供IdentityServer4的Api接口进行供前端调用来进行登录和管理)。
登陆
在我将登陆页面和API接口都搞定了之后,我准备测试一下,能否通过发请求的方式实现身份认证。
1、将IdentityServer4的登陆地址修改为Vue项目的地址
2、Vue的默认路由组件
以上两步做完之后,启动Vue,启动后按我所想的跳转到了我的登录页面
然后输入用户名密码进行登录。正确的命中了我打得断点,执行完之后却出了问题,并没有按我所想的,跳转到我给的重定向地址,而是卡在了callback请求中(验证请求后,会跳转到identityServer4的AuthorizeCallbackEndpoint端点去根据授权模式来判断是返回Code还是直接重定向到客户端的地址)
控制台中确实请求了这个地址,但会一直得不到响应,最终超时,为了弄清楚这个问题花了我两天的时间,还下载了IdentityServer4的源码来一步一步的调试,最终发现在调用了Redirect()方法后,.netCore并没有接收到callback请求,虽然调试界面显示发送了这个请求,但并没有进入.netCore的管道中,想了一下,应该是跨域的问题,尽管我设置了允许任何跨域请求,还是不行。
然后我准备返回地址然后在页面直接请求callback的地址,,结果显示没有登录,又给我重定向到登录页面了。。。
尽管我这里
已经成功了,但并没有在httpcontext中通过验证,应该是管道返回的时候IdentityServer4内部设置的吧。
最后为了验证是否是跨域的问题,我将两个项目部署到了同一个端口下面。最终成功通过了验证。
2020-8-5日更新
接上文,后来没办法,准备使用BlazorWebassembly来做这个事情,截止到目前,已经吧登陆登出和用户列表等相关模块都写好了,期间也踩了一些坑,但都解决了。
但BlazorWebassembly用着让我很不舒服,比如scss、热更新啥的要用的话很麻烦,且效果也不好,第三方的UI框架用着也有很多问题。期间又对IdentityServer4有了更深入的理解。发现以前可能是因为Cookies的问题导致的。
起因
某一天,谷歌浏览器更新了之后,我发现我的Blazor项目登陆不了了,而且也是回调地址(callback)验证时,提示没有登陆。这次在同一域名下,不存在跨域问题。但是以调试模式运行又没有问题。这就奇了怪了。经过仔细对比非调试和调试时的登陆过程,最终发现,非调试模式下,设置的Cookies因为Same-Site的原因,没有在callback请求中带过去导致的。然后又去查找资料,解决了这个问题。
解决方案参考官方文档:https://docs.microsoft.com/zh-cn/aspnet/core/security/samesite?view=aspnetcore-3.1#supporting-older-browsers
这件事让我意识到之前的问题可能是因为cookies的问题导致的。立马启动以前的代码,启动,运行。登录。果然。响应头里没有Set-cookie。然后打了断点,在管道返回的httpcontext的reponse的cookies里发现确实设置了cookies。我意识到可能不是identityserver4的问题。
解决
然后百度.netcore 设置cookies的相关文章。还是没有找到解决方案。然后想了一下,有没有其他人也有前后端分离验证的想法。百度搜。没有,然后用必应搜identityserver4前后端分离验证,没有。。最后用英文搜identityserver4 login ui for spa。然后在
stackoverflow上面找到了一篇文章,也是遇到了跟我一样的问题。他也觉得是cookies的问题。最后在下面找到了解决方案。要在对请求头加上"Access-Control-Allow-Credentials", "true",加了这个,你的请求才会带上cookie,同样的服务器要设置cookie也需要这个头。axios只需要配置axios.defaults.withCredentials = true即可。我迫不及待的修改了相关代码。然后运行登陆。
芜湖~
这两个cookie终于出现在了我的vue网站里。然后发送callback请求。成功的通过了验证!!!
反思
总的来说还是自己太菜了。很多知识都不了解。然后查看文档的时候又不仔细。如果当时仔细看了官方文档的授权流程。估计也能很快解决吧。获取早点去必应上搜“identityserver4 login ui for spa”这个。也能很快的解决问题。
这件事还是收货颇多,学会了blazor的很多知识,以及identityserver4的更多细节,以及最重要的解决问题的方法和思路。
记录一下。时刻提醒自己。以后学习新知识的时候一定要多看文档。遇到问题尽量多看文档。实在没有就百度,百度没有就上必应用英文搜。最后还不行就只能看源码了。
附上我的Ids4前后端分离开源项目的码云地址:https://gitee.com/wlmy1996/Wlmy.Ids4.git