1

訪問Microsoft Graph我正在參加暑期開發課程,並一直致力於編寫一個允許用戶登錄到個人,工作或學校的API Microsoft.com帳戶並對其日曆中的事件執行基本的CRUD操作。諸如查詢日期範圍內的所有事件或具有指定打開擴展屬性的事件等。如何從Asp.net Core 1.1 MVC

完成該操作後,我正在使用ASP.net Core 1.1 MVC編寫一個前端。這裏的基本目標是用一些細節列出用戶查詢的結果,然後允許用戶選擇一個事件來查看其所有細節,編輯它或刪除它。將會有一個單獨的視圖來允許創建新的事件。但是,在從基本控制檯應用程序切換到ASP.net Core 1.1 MVC(來自Microsoft Graph UWP Snippets,位於here)之前,我使用的身份驗證方法似乎不適用於ASP.net Core 1.1。具體來說,從上面的鏈接(AcquireTokenSilentAsync())的第58行。

在決定來這裏問一個問題之前,我已經做了很多挖掘工作,但我真的覺得我無處可去/浪費時間,我需要花費在開發上。由於與課程相關的原因,教授非常放手,所以向他求助並不是一種選擇。

如何設置一個ASP.net Core 1.1 MVC應用程序來允許訪問登錄用戶的日曆?由於我的API目前非常依賴於從上述Authentication方法返回的令牌(它與API中使用的HttpClient和GraphServiceClient一起使用),所以我真的無法找到很多東西,所以我需要儘快找出答案。

更新:我找到了一個使用OpenIdConnect在Asp.net MVC 6中將用戶登錄到他們的Microsoft.com帳戶的教程,但是我不確定是否有辦法獲取身份驗證令牌我需要使用Graph Client/HttpClient。另外,我還沒有找到類似的ASP.net Core 1.1 MVC教程。我會繼續挖掘併發布我在這裏找到的任何東西。

更新2:沒有那個運氣,已經切換到嘗試使用OAuth 2.0 Authorization Code Grant Flow。目前在理解如何獲取授權碼以獲取訪問令牌方面存在一些問題。如果我設置了responseMode=query,是否實際上必須查詢我在註冊我的應用程序時創建的應用程序的重定向url(本例中爲localhost:xxxx /),還是在用戶登錄/同意讓我的應用程序自動返回響應訪問他們的數據?

更新3:我越來越接近通過更新2中的鏈接中的步驟進行功能驗證過程。在這一點上,我想我只是好奇,如果我原來的認證方法(幾乎相同到我原來發布的鏈接中包含的內容)本可以發揮作用,或者無論如何我都會發現自己處於這個位置。

+0

你提到AcquireTokenSilentAsync()失敗。是否會捕獲異常,以便在#70行上調用AcquireTokenAsync()方法? https://github.com/microsoftgraph/uwp-csharp-snippets-rest-sample/blob/master/O365-UWP-Unified-API-Snippets/AuthenticationHelper。cs#L70 –

+0

我剛剛完成了一些更深入的研究。 'AcquireTokenSilentAsync()'不會_fail _--它在我的控制檯應用程序中無法正常工作。在控制檯應用程序版本中,唯一的參數是範圍。當我將授權代碼轉移到新的asp.net核心1.1應用程序時,我發現它現在需要範圍**和** IUser用戶 - 並且我不知道我應該在哪裏獲得該用戶對象來自。 編輯:沒有用'AcquireTokenAsync()'方法改變。我想在理論上我可以簡單地用它來代替它?不確定它是否會起作用。 – CthuluHoop

+0

_「... IUser用戶 - 我不知道我應該從哪裏獲取該用戶對象...」_ 在您的所有MVC控制器中都有一個User靜態對象。你嘗試過嗎? – zemien

回答

0

我設法使用這個樣本庫的大部分:Microsoft Graph Webhooks Sample for ASP.NET Core來連接到Microsoft Graph API。它演示使用webhooks和MS Graph訂閱,但它是如何獲得對我們有用的訪問令牌。

相關的代碼片段:

AuthenticationResult authResult = await authContext.AcquireTokenAsync(GraphResourceId, 
    new ClientCredential(AppId, AppSecret)); // For sample purposes only. Production apps should use a client certificate. 
return authResult.AccessToken;