2017-05-26 32 views
1

編輯:使用Microsoft Graph令牌驗證App Services後端?

我已經添加了「id_token」,但仍然得到「未經授權」的迴應。 這裏是我的登錄代碼:

PublicClientApplication myApp = new PublicClientApplication("My-AppID-From-App-Registration-Portal"); 
string[] scopes = new string[] { "User.Read" }; 
AuthenticationResult authenticationResult = await myApp.AcquireTokenAsync(scopes).ConfigureAwait(false); 

JObject payload = new JObject(); 
payload["access_token"] = authenticationResult.AccessToken; 
payload["id_token"] = authenticationResult.IdToken; 

user = await MobileService.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount, payload); 

原貼:

是否可以驗證到使用Microsoft圖形檢索到的令牌應用服務後端? 我已經嘗試使用此令牌並將AzureActiveDirectory作爲提供者調用LoginAsync(),但這不起作用。

JObject payload = new JObject(); 
payload["access_token"] = GraphAuthenticationHelper.TokenForUser; 
user = await MobileService.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, payload); 

這可能嗎?

+0

我想你想使用WindowsAzureActiveDirectory作爲提供者參數。另外,打開門戶中的應用程序日誌記錄,您應該能夠看到警告消息以及未經授權的響應的原因。你能分享這些信息嗎? –

+0

好的,即使使用MSA帳戶?無論哪種方式,兩者都不起作用。 在「LogFiles/DetailedErrors」下,我收到以下信息: HTTP錯誤401.83 - 未經授權 最有可能的原因: 經過身份驗證的用戶無權訪問處理請求所需的資源。 詳細錯誤信息: 模塊 EasyAuthModule_32bit 通知 的BeginRequest 處理程序 ExtensionlessUrlHandler集成-4.0 錯誤代碼 0x80004005的 請求的URL 的https:// myapp__9131:80/.auth /登錄/ AAD 物理路徑 d :\ home \ site \ wwwroot \ .auth \ login \ aad –

+0

對不起,我應該更具體。您需要查看*應用程序*日誌(診斷日誌 - >應用程序日誌記錄(文件系統))。我認爲你在看的是Web服務器日誌。順便說一下,這是一個支持AAD和MSA的融合AAD端點,對嗎? –

回答

1

我認爲沒有,請參考文獻:https://docs.microsoft.com/en-us/azure/app-service-mobile/app-service-mobile-dotnet-how-to-use-client-library#a-nameauthenticationaauthenticate-users

與移動應用的後端客戶端ID替換INSERT-資源ID-HERE。您可以從門戶中的「Azure Active Directory設置」下的「高級」選項卡中獲取客戶端ID。

訪問令牌的觀衆應該是您的移動應用的後端客戶端ID。因此,如果資源是https://graph.microsoft.com/(訪問令牌中的aud聲明),則客戶端管理的身份驗證將不起作用。

+0

本文檔說「客戶端流量優先」,然後繼續鏈接Live SDK,我相信這會被棄用。所有這些文件中的混合信息量實際上很難遵循。 與MSGraph API一樣,App Services也是Microsoft Service。我希望這兩個人能夠一起合作。 感謝Chris Gillum發佈的一篇文章,我使用Azure AD帳戶: https://stackoverflow.com/questions/44010063/calling-microsoft-graph-api-from-inside-azure-functions/44013797# 44013797 但是,這不適用於Microsoft帳戶,有什麼想法爲什麼? –

2

更新:在我原來的答案中,我說你不能這樣做。但事實上,你可以做到這一點,但這是一件危險的事情,因爲任何擁有有效Microsoft Graph令牌的人都可以理論上訪問你的API。在我走向這條路之前,讓我描述一下代表最終用戶訪問Microsoft Graph的「正確」方式。

要做到這一點的正確方法是使用移動後端代碼中的代表流代碼來交換Microsoft Graph令牌的用戶ID令牌。流程如下所示:

  1. 客戶端啓動與AAD使用MSAL登錄,並將資源向移動後端(而不是圖表)。結果應該是一組令牌。
  2. 客戶端使用移動SDK通過#1的access_token和id_token進行登錄。

示例代碼:

JObject payload = new JObject(); 
payload["access_token"] = {access_token.from.msal}; 
payload["id_token"] = {id_token.from.msal}; 
var user = await MobileService.LoginAsync(
    MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, 
    payload); 
  • 後端代碼交換用戶的ID令牌(從x-ms-token-aad-id-token請求頭),用於圖令牌。該令牌交換被稱爲「代表」,並且被記錄爲here。我認爲這可以使用ADAL或MSAL庫來完成,但我無法找到文檔。它也很簡單,你可以直接實現HTTP協議,而不會有太多的麻煩。
  • 後端使用新獲取的MS Graph令牌並進行圖API調用。
  • 您還可以在後端緩存您獲取的圖形令牌,以便每個API調用不需要更多的AAD API調用來執行令牌交換。

    +0

    感謝Chris的回覆。 因此,如果我將圖形標記與我的API調用一起傳遞,那意味着我必須兩次驗證用戶,一個用於App Services,另一個用於獲取Graph標記。它是否正確? 您在上述評論中鏈接的解決方案對於AAD非常適用,我很困惑爲什麼它不像Microsoft帳戶那麼簡單。特別是因爲它被吹捧爲MSA和AAD的一個終點。 WAs希望爲用戶提供一個登錄名,用於MSA和AAD,可用於對App服務進行身份驗證,並訪問MS Graph。 –

    +0

    您不需要使用我的建議進行兩次驗證。您的後端將僅接受令牌,並使用它來調用MS Graph API的API。 TBH,我很驚訝我的鏈接解決方案對AAD w/v2端點有效。總的來說,AAD正在擺脫「資源」模式,這就是爲什麼我不完全驚訝它不適用於MSA賬戶(MSA在AAD v1中完全不受支持)。 –

    +0

    我的歉意克里斯,我不明白。 我應該使用哪種客戶端流程用於MSA? 我試過MSAL,但從它檢索到的令牌沒有通過App服務進行認證。我將它作爲JObject中的「access_token」傳遞給AzureMobileClient.LoginAsync()方法。我收到了未經授權的回覆。所有文檔都指出使用Live SDK即將推出。我應該用它嗎?這是唯一的方法嗎? –