透過Azure AD實踐網站單一登入機制
無論是實踐單一登入(SSO)所需要的身分驗證,或是採用OAuth機制,讓用戶授權第三方應用程式來存取受管理的資源,都會從『建立一個應用程式』開始。
Google, 微軟, Twitter, LINE…都有自己的OAuth機制。Google 位於API Console, 微軟位於Azure AD,而LINE 則是使用LINE Login…這也是你常常會看到現在許多網站都有支援各種SSO身分驗證機制的原因:
在Azure AD註冊應用程式
底下我們以微軟的身分驗證機制,拿Web類型的第三方應用程式來做例子,這段影片,示範了如何在Azure AD上建立一個應用程式:
從上面的展示,你會看到我們在Azure Portal上建立好一個 App, 並設定Redirect URL,並取得App ID。建立時,身分驗證類型有四種:
分別是:
A. 企業用,只支援該AAD所屬企業
B. 企業用,支援所有具有AAD的企業
C. 企業(to B)+個人(to C),上述B加上個人帳號(例如hotmail.com, outlook.com, msn.com…等)
D. 僅限個人帳號登入,例如 hotmail.com, outlook.com, msn.com…等
接著,我們要建立並取得待會Web應用程式需要進行身分驗證時,所需要的 App Secret:
另外別忘了,再次檢查設定好的redirect URL,測試階段我們先用 localhost:
完成之後,我們就可以來測試一下,如何使用OAuth的身分驗證機制來取得access token。
OAuth Authorization Code Flow
依照OAuth的Authorization code flow流程,我們的作業流程分成兩個階段,
A> 第一個階段我們做身分驗證,並取得代碼(code),
B> 第二階段再拿code去跟伺服器端要access token。
第一階段,我們需要提供底下這些資訊(剛才都已經蒐集到):
- App Clinet ID
- redirect URL
微軟AAD使用的 endpoint 為:
https://login.microsoftonline.com/common/oauth2/v2.0/authorize?response_type=code&client_id=[your_app_id]
&redirect_uri=http://localhost&scope=openid https://graph.microsoft.com/user.read
我們可以直接把上面的endpoint中的your_app_id換掉即可,因為這段endpoint是可以透過瀏覽器運行的,所以我們先以瀏覽器來測試:
請看上面影片中的展示,我們組出一個身分驗證與授權的URL,由於是 http redirect的URL,因此直接貼上瀏覽器運行,接著,用戶會被導入登入頁面,由用戶輸入帳號密碼,應用程式即可從網址列取得code。
取得code之後,我們要拿這個code換取token,這部分為了安全起見,OAuth Authorization Code Flow的定義是採用後端以http post方式來呼叫,因此我們採用 postman 來模擬。
這個階段,也需要底下這些資訊(一開始也蒐集到了):
- App Clinet ID
- redirect URL
- App Secret
整個操作影片如下:
從上面的影片中你會看到,取得 token 之後,就可以使用 token 來取得用戶資訊了。
小結
上面這幾段影片,展示了從建立App,但透過app以flow取得code,接著再用code換取token,並且拿token取得用戶個人資料(name & email),這意味著,透過這樣的流程,你不僅僅可以在安全的前提下驗證用戶身分,且第三方應用程式,可以透過取得的token取得用戶被管理的資源。
上面的流程是採用瀏覽器與postman模擬呼叫的方式來進行,若你真的要應用在自己開發的第三方應用程式,只需要把上面的流程改為透過程式碼來運行即可。 可參考 https://github.com/isdaviddong/HOL-DotNetCore/blob/master/Auth/使用 .net core 搭配 AAD 進行MS SSO身分驗證.md
留言