前後端分離專案,後期前端身份驗證的麻煩

ggtc發表於2024-08-08

軟體構成

  • 後端
    後端是一個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錄頁面,並短路請求處理管道。

image

  • redirect.html
    對於redirect第三方系統跳轉此係統頁面,則是在url中傳入了一個token,前端專案驗證token有效性之後放入到redis中。同時redirect頁面也把這個token放入本地cookie。之後新標籤頁都會帶上這個cookie。在前端專案的中介軟體中進行驗證。

image

問題

對於在新標籤頁開啟頁面的形式,這種身份驗證方式執行良好,沒有任何問題。

但是使用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中。這種頁面不知道有多少,多了就寄了。

我這裡還有域名不同,頂級域名不同的系統,第二種方案就省心多了。

相關文章