通過第二篇文章我們已經知道了授權的內部實現通過自定義的授權Handler來的,同樣的道理
OpenIdConnect 同樣是通過 OpenIdConnectHandler來請求授權的
那么它內部又是怎么來實現的呢?
接下來直接分析OpenIdConnectHandler的處理,如我們加了那么多參數:
.AddOpenIdConnect(o => { o.ClientId = "ClientId"; o.ClientSecret ="Secret"; o.Authority ="Authority" ; o.ResponseType = OpenIdConnectResponseType.CodeIdToken; o.GetClaimsFromUserInfoEndpoint = true; });
在IdentityServer4認證服務端其實就是可以配置這些 clientid 等,AddOpenIdConnect 實際就是通過這種(OIDC)協議去發起遠程請求認證,結合前面一章,其實還是通過IAuthenticationServices、IAuthenticationHandler里面去處理重寫實現
HandleRequestAsync,而在HandleRequestAsync內部就是通過遠程請求授權認證,下面來看這段
<!doctype html> <html> <head> <title>這里就是重新定向到身份提供者</title> </head> <body> <form name="form" method="post" action="{0}"> {1} <noscript>單擊完成授權: <input type="submit" /></noscript> </form> <script>document.form.submit();</script> </body> </html>
OpenIdConnect內部動態的根據參數拼湊了這樣一段html代碼並且直接提交執行,說道這里可能就會想到 在使用IdentityServer4的時候 其中的 302 跳轉,其實就是動態的輸出了這個頁面,然后立即提交跳轉到身份認證提供者
這里其中還要說的就是 SignOut的處理,在使用OIDC登錄進行身份認證的時候,如果 Signout的時候需要 Signout 遠程的身份提供者,同時如果這里有SSO登錄,還要清除掉其他系統的登錄信息,這里就要主動發起通知了,所以這里會有HandleSignOutCallback的處理,就是為了回調通知其他身份認證的應用,通知他們清除本地的身份認證退出,所以一般在使用OIDC登錄身份認證的時候,一般還需要寫Callback處理,具體可以參考前面的IdentityServer4相關文章
關於其中的Events事件就多說,無外乎就是外部需要對內部認證失敗等等信息后續做的一些處理事件