我想弄清楚的流程是這樣的:
- UserA 登錄到 ClientA
- ClientA 重定向到身份服務器以驗證用戶
- 認證后 ClientA 在自己的系統中管理用戶資訊
- 發現用戶 A 是“壞演員”
- AdminUser 進入 IdentityServer AdminTool(一個不同的客戶端應用程式,用于管理 IdentityServer,包括用戶)。
- AdminUser 執行“撤銷”UserA 的操作
- 從管理工具呼叫 IdentityServer 后端,其中 UserA 的“已啟用”屬性設定為 false。
在流程的這一點上,我想將用戶從 IdentityServer 的后端踢出 ClientA。
更多背景關系:IdentityServer 在客戶端瀏覽器中使用 cookie 來保持“會話”(不確定這是否正確,因為實際上沒有任何狀態被管理)。還使用cookies來記住我。
有沒有辦法從后端洗掉 IdentityServer 的 cookie?或者通知客戶端 UserA 不應再具有有效的身份驗證,以便它可以執行 HttpContext.SignOutAsync()?
我正在查看此鏈接:https : //docs.identityserver.io/en/latest/topics/signout.html以獲取指導,但我堅持如何從后端作為 AdminUser 執行此操作。呼叫 HttpContext.SignOutAsync() 將注銷發出請求的 AdminUser,而不是在 ClientA 中造成破壞的 UserA。
uj5u.com熱心網友回復:
在使用身份服務器的典型設定中,您有:
- 生命周期短的 JWT 令牌
- 會話 cookie
JWT 令牌需要經常更新。當沒有有效的 JWT 時使用會話 cookie。在這種情況下,用戶將被重定向到登錄頁面,如果有會話 cookie,用戶將被自動驗證并重定向回客戶端應用程式。
因此,您有一些退出選項:
- 確保用戶無法更新他的 JWT(= 幾分鐘后注銷)
- 確保用戶無法再次登錄
- 真正清除瀏覽器中的所有內容(并確保他無法再次登錄/續訂)
回到你的問題
有沒有辦法從后端洗掉 IdentityServer 的 cookie?
這里的答案是 WebSockets,它允許雙向通信。
- https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API
C# 的常用庫是 Signal/R
- https://dotnet.microsoft.com/apps/aspnet/signalr
您將在服務器端創建一個 Hob,允許您向“壞用戶”發送訊息。
- https://docs.microsoft.com/en-us/aspnet/core/signalr/hubs?view=aspnetcore-6.0
并在您的客戶端應用程式中偵聽這些訊息:
- https://docs.microsoft.com/en-us/aspnet/core/signalr/javascript-client?view=aspnetcore-6.0
請注意:無論您在客戶端做什么,重要的部分通常是阻止服務器請求。洗掉客戶端上的 cookie 是不安全的。您必須改為在服務器端洗掉會話。
補充說明:
- 您設定中的流程可能與我上面描述的不同。
- 我知道,這只是部分答案,但評論內容太多了 ;-)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/364426.html
