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

參考資料:Custom login UI for IdentityServer 4


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM