2016-08-21 82 views
3

我用的是Microsoft.Experimental.IdentityModel.Clients.ActiveDirectory NuGet包進行認證,以Outlook.com API,但是,像一個月前在OutlookServicesClient.Me中定義的所有成員大大停止工作不明原因(如:OutlookServicesClient.Me.MailFolders.Where(predicate).ExecuteSingleAsync())拋出一種服務器請願失敗的錯誤消息,沒有有用的信息,所以出於這個原因,我想嘗試常規庫:Microsoft.IdentityModel.Clients.ActiveDirectory看看它是否能自動解決問題,而不是嘗試使用實驗版本。從實驗ADAL適應代碼構建到最新ADAL構建

我遇到的問題是試圖遷移下面的代碼,這是基於實驗構建的語法。我沒有發現AcquireTokenAsync函數有任何過載,我可以在其中指定範圍Outlook作用域,並且我沒有找到其他方式來執行此操作,另外AcquireTokenAsync函數的第一個參數需要一個resource字符串參數,我不知道我必須放在那裏。

我看到使用AcquireTokenAsync的官方和第三方示例,但我很困惑,試圖去適應它們,因爲resource參數或其他東西,我不知道它們是如何工作的,還有我看過的很多示例是爲ASP.NET,但我使用Windows窗體


這是我需要/更新遷移到新ADAL語法和方法重載的代碼:

VB.NET版本(原碼)

Dim scopes As String() = { 
    "https://outlook.office.com/mail.read", 
    "https://outlook.office.com/mail.readwrite", 
    "https://outlook.office.com/mail.send" 
} 

Dim cache As New TokenCache() 
Dim authContext As New AuthenticationContext("https://login.microsoftonline.com/common", cache) 
Dim authResult As AuthenticationResult = 
    Await authContext.AcquireTokenAsync(scopes, Nothing, "*Client ID*", 
             New Uri("urn:ietf:wg:oauth:2.0:oob"), 
             New PlatformParameters(PromptBehavior.Auto)) 

Dim client As New OutlookServicesClient(New Uri("https://outlook.office.com/api/v2.0"), 
             Function() Task.FromResult(Me.authResult.Token)) 

C#版(未經測試在線翻譯)

string[] scopes = { 
    "https://outlook.office.com/mail.read", 
    "https://outlook.office.com/mail.readwrite", 
    "https://outlook.office.com/mail.send" 
}; 

TokenCache cache = new TokenCache(); 

AuthenticationContext authContext = 
    new AuthenticationContext("https://login.microsoftonline.com/common", cache); 

AuthenticationResult authResult = 
    Await authContext.AcquireTokenAsync(scopes, null, "*Client ID*", 
             new Uri("urn:ietf:wg:oauth:2.0:oob"), 
             new PlatformParameters(PromptBehavior.Auto)); 

OutlookServicesClient client = 
    new OutlookServicesClient(new Uri("https://outlook.office.com/api/v2.0"), 
          () => Task.FromResult(authResult.Token)); 

這是我翻譯的意圖,它不是第一個工作,因爲我不知道在哪裏設置三個展望範圍網址,並secondlly因爲當我接受了微軟的許可Web表單它說,它不能由於請求無效而被處理。 (我設置爲Nothing/nulresource PARAM)

VB.NET版本(原碼)

Dim cache As New TokenCache() 
Dim authContext As New AuthenticationContext("https://login.microsoftonline.com/common", cache) 
Dim authResult As AuthenticationResult = 
    Await authContext.AcquireTokenAsync(resource???, "*Client ID*", 
             New Uri("urn:ietf:wg:oauth:2.0:oob"), 
             New PlatformParameters(PromptBehavior.Auto)) 

Dim client As New OutlookServicesClient(New Uri("https://outlook.office.com/api/v2.0"), 
             Function() Task.FromResult(authResult.AccessToken)) 

C#版本(未經測試的在線翻譯)

TokenCache cache = new TokenCache(); 

AuthenticationContext authContext = 
    new AuthenticationContext("https://login.microsoftonline.com/common", cache); 

AuthenticationResult authResult = 
    Await authContext.AcquireTokenAsync(resource???, "*Client ID*", 
             new Uri("urn:ietf:wg:oauth:2.0:oob"), 
             new PlatformParameters(PromptBehavior.Auto)); 

OutlookServicesClient client = 
    new OutlookServicesClient(new Uri("https://outlook.office.com/api/v2.0"), 
          () => Task.FromResult(authResult.AccessToken)); 

回答

1

要使用V2端點來驗證客戶端應用程序,我們可以使用MSAL liabrary。

這是給你參考的例子:

通過的NuGet安裝包: Install-Package Microsoft.Identity.Client -pre

示例代碼檢索令牌:

public static async void GetToken() 
    { 
     string clientId = "0cfa4d3e-db48-400f-9b44-901cd5975312"; 
     var app = new PublicClientApplication(clientId); 
     AuthenticationResult result = null; 
     try 
     { 
      string[] scopes = { 
        "https://outlook.office.com/mail.read", 
        "https://outlook.office.com/mail.readwrite", 
        "https://outlook.office.com/mail.send" 
       }; 

      result = await app.AcquireTokenAsync(scopes); 
      Console.WriteLine(result.Token); 
     } 
     catch (MsalException ex) 
     { 

     } 
    } 

而且here是一個細節樣品添加登錄到Windows桌面應用程序。

+0

感謝您的回答,但我並不理解您告訴我要做什麼,而Microsoft.Identity.Client是與Microsoft.IdentityModel.Clients.ActiveDirectory不同的命名空間和庫,我使用的是AuthenticationContext '類連接到** https://login.microsoftonline.com/common**,但該類似乎沒有在您提到的庫中定義。 – ElektroStudios

+0

更重要的是,我不明白爲什麼微軟發佈了各種類似的庫,實際上它們有着相同的目的,所有這些讓我產生了什麼樣的困惑,我只想修改上面的代碼,而不是替換整個庫學習新的使用新方法及其語法和它們的參數等。 – ElektroStudios

+0

使用我的代碼接收到的令牌,它引發了一個帶有錯誤消息的異常**資源找不到段「文件夾」**使用一個簡單的調用像這樣:'昏暗的文件夾作爲IPagedCollection(Of IFolder)=等待'Microsoft.OData'庫的client.Me.Folders.ExecuteAsync()'。現在我收到另一個錯誤消息:「**不支持** OData請求**」,但不支持MSAL?什麼東西,我很困惑。 – ElektroStudios