軟體構成
- 後端
後端是一個asp.netcore webapi
專案,使用jwt進行身份驗證和鑑權。 - 前端
前端是一個基於http協議的asp.netcore RezorPage
專案,但實際上完全使用的wwwwroot
目錄下的靜態檔案。沒有使用RazorPage
。
目前只有後端介面鑑權,前端頁面任意訪問
身份驗證需求
這兩天安全要求下來了,要求給前端頁面加上身份驗證。只開放login
登入頁面redirect
第三方系統跳轉此係統頁面。初始辦法是後端登入生成token後,放到redis
中。
- login.html
訪問前端login登入頁面,點選登入後,後端介面返回token,login頁面將token放在本地cookie
中。之後開啟新頁面時都會帶上這個cookie。前端中介軟體中取出cookie中的token,和redis中的token比較。如果一致,則放行到下一個中介軟體。如果不一致,則重定向到login錄頁面,並短路請求處理管道。
- redirect.html
對於redirect
第三方系統跳轉此係統頁面,則是在url中傳入了一個token,前端專案驗證token有效性之後放入到redis中。同時redirect頁面也把這個token放入本地cookie。之後新標籤頁都會帶上這個cookie。在前端專案的中介軟體中進行驗證。
問題
對於在新標籤頁開啟頁面的形式,這種身份驗證方式執行良好,沒有任何問題。
但是使用cookie進行身份驗證有一個問題。就是iframe
框架限制了跨域的cookie提交。當redirect被嵌入其它系統時,首先,這個本地cookie被禁止寫入。其次,cookie不會被放到請求中,因此一直往登入頁面跳轉。
我之後試了下會話cookie
,也就是session
。但是被檢視響應資訊,提示會話cookie同樣被瀏覽器禁止寫入。這下子就麻煩了,好多其它系統頁面都使用了iframe嵌入這個專案的頁面。如果加上前端身份驗證的話,那些地方的iframe都會跳轉到登入頁面。
是否只有https才能在iframe中攜帶cookie,解決這個跨域問題?
最終方案
經過@the boy、圖樣圖森破的提醒。我最終決定兩種方案都使用。但是透過url傳遞,而不是header,沒法給html請求設定header啊。
我這裡存在一種情況,不同域名的第三方系統,iframe開啟的頁面還會有彈窗子頁面,這個彈窗也是一個iframe。這種情況使用第一種方案,同時還要改造原來的iframe中的頁面,把token新增到其彈窗的子頁面url中。這種頁面不知道有多少,多了就寄了。
我這裡還有域名不同,頂級域名不同的系統,第二種方案就省心多了。