在Office Add-in中實現單點登錄(SSO)

做者:陳希章 發表於 2017年12月27日git

這篇文章通過屢次修改,終於在今天晚上寫完了,演示用的範例代碼也終於跑通了。由於這個SSO的功能目前只是Preview的狀態,因此本篇文章嚴格參考了官方的文檔,而且對其中的重點環節作了提示,對最終效果作了說明。github

官方的文檔請參考 https://docs.microsoft.com/en-us/office/dev/add-ins/develop/sso-in-office-add-ins瀏覽器

Office Add-in SSO 認證流程和原理

實現Office Add-in 的單點登陸是要解決一個典型問題:已登錄到Office的用戶,可否直接利用他本身的身份去訪問到Microsoft Graph的資源,而無需再次登陸。app

請注意,目前這個功能是Preview的狀態。因此要進行測試的話,你必須是某個Office 365 Tenant的全局管理員。若是不具有這個條件,你將沒法完成這個實驗,但你能夠經過這個文章對單點登陸流程和效果有一個基本認識。工具

下圖是Office Add-in中進行SSO認證的標準流程。這裏面涉及到幾個部分測試

  1. Office 宿主程序。
  2. Office Add-in
  3. Office Add-in Service(一般是一個API服務)
  4. Azure AD V2(請注意,必須是2.0)
  5. Microsoft Graph

基本流程以下網站

  1. Office Add-in發起一個請求,getAccessTokenAsync。
  2. Office 宿主程序會向Azure AD 發起一個請求,去獲取當前用戶的一個所謂的addin token。
  3. Office Add-in獲得這個addin token後,將其發送到Office Add-in Service,並請求Microsoft Graph的資源。請注意,Office Add-in 和 Office Add-in service必須使用同一個域名。
  4. Office Add-in Service 向Azure AD發起請求,利用addin token交換獲得真正的access token。
  5. Office Add-in Service 利用獲得的access token去訪問Microsoft Graph,並將結果返回給Office Add-in。

如何運行官方案例,體驗Office Add-in SSO的效果

我是徹底按照 這篇文章進行了實驗,而且已經作出來效果。下面我將有關的步驟,尤爲是一些要注意的步驟介紹一下。(該文檔的部分地方存在一些小問題,我已經提報給做者了)。調試

  1. 實驗環境。你須要安裝最新的Visual Studio 2017和Office 2016(版本1708或者更新)。code

  2. 克隆這個代碼庫 https://github.com/officedev/office-add-in-aspnet-ssotoken

  3. 在***Completed***目錄中找到 Office-Add-in-ASPNET-SSO.sln,雙擊打開這個解決方案。

  4. 此時編譯解決方案會報錯,請運行 Install-Package Microsoft.Identity.Client -IncludePrerelease 命令安裝一個包。再次編譯,請確保沒有任何錯誤。

  5. https://apps.dev.microsoft.com/ 註冊一個應用程序,這個步驟比較重要,必定要嚴格按照說明操做。下面是我註冊的信息,請必定要確保保持一致。

  6. 將上圖中的Application ID和Application Secret信息記下來,而且將Application ID的信息替換掉這個地址中的佔位符:https://login.microsoftonline.com/common/adminconsent?client_id={application_ID}&state=12345 獲得 https://login.microsoftonline.com/common/adminconsent?client_id=f7e0154d-1258-42ef-9e89-9857889f4e01&state=12345。

  7. 目前來講,要測試這個功能,你必須擁有一個Office 365 Tenant的全局管理員身份。在瀏覽器中輸入上面這個地址,而後提供你的管理員身份,你會收到以下的提示,要你接受受權的請求。

    點擊「Accept」(有時候可能要兩次)後,頁面會被重定向到下面的地址。請不要驚慌,由於當前咱們的Office Add-in網站沒有運行起來,因此確實會報告「沒法訪問此網站」。在這裏,只要將地址欄中的tenant這個查詢字符串的信息記下來便可(個人例子是:ca2af238-5e61-4608-8622-797a954c4d65),後面要用到。

  8. 回到Visual Studio 2017裏面來,找到 Office-Add-in-ASPNET-SSO-WebAPI 這個項目中的Web.config文件,在appsettings裏面修改幾個設置信息。

  9. Office-Add-in-ASPNET-SSO 這個項目中,找到 Office-Add-in-ASPNET-SSOManifest這個文件,在最底部,修改WebApplicationInfo這個節的信息以下:

  10. 選擇Office-Add-in-ASPNET-SSO 這個項目,在右鍵菜單中選擇「發佈」,而後新建一個配置文件:

    而後點擊「打包外接程序」按鈕

    輸入當前本地調試用的網址後點擊「完成」,你將獲得一個能夠用於部署的清單文件

  11. 利用清單文件加載該Add-in。這個Add-in是用於PowerPoint的,它的詳細代碼我這裏就不展開了,它實現了一個簡單的功能用來讀取當前用戶的OneDrive for Business中的文件列表信息。

    個人實驗環境中,當前用戶的OneDrive for Business中有以下的文件:

    請在Visual Studio中將「Office-Add-in-ASPNET-SSO-WebAPI」這個項目運行起來,而後經過PowerPoint Online建立一個演示文檔,在菜單中選擇「插入」=》「Office 加載項」,而後選擇「上載個人加載項」,選擇上一步驟中生成的XML文件。

    而後你能夠在工具欄中看到一個新的按鈕,點擊以後能夠顯示一個任務面板

    最後,激動人心的時刻終於要到了。點擊任務面板中的「Get My Files From OneDrive」按鈕,你將在任務面板的下方看到OneDrive for Business中的文件列表信息。

    固然,不少時候,我也發現會遇到以下的錯誤。

結語

本文對於最新的Office Add-in中實現單點登陸(SSO)的方案進行了講解,而且將配套的實例進行了測試。因爲當前這個功能仍是很是早期的階段,因此可能你在作實驗的時候,也會遇到這樣那樣的問題。若是遇到,能夠給我留言。我過一陣子會繼續關注一下這個功能的進展,給你們更新。

相關文章
相關標籤/搜索