我用的是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
/nul
的resource
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));
感謝您的回答,但我並不理解您告訴我要做什麼,而Microsoft.Identity.Client是與Microsoft.IdentityModel.Clients.ActiveDirectory不同的命名空間和庫,我使用的是AuthenticationContext '類連接到** https://login.microsoftonline.com/common**,但該類似乎沒有在您提到的庫中定義。 – ElektroStudios
更重要的是,我不明白爲什麼微軟發佈了各種類似的庫,實際上它們有着相同的目的,所有這些讓我產生了什麼樣的困惑,我只想修改上面的代碼,而不是替換整個庫學習新的使用新方法及其語法和它們的參數等。 – ElektroStudios
使用我的代碼接收到的令牌,它引發了一個帶有錯誤消息的異常**資源找不到段「文件夾」**使用一個簡單的調用像這樣:'昏暗的文件夾作爲IPagedCollection(Of IFolder)=等待'Microsoft.OData'庫的client.Me.Folders.ExecuteAsync()'。現在我收到另一個錯誤消息:「**不支持** OData請求**」,但不支持MSAL?什麼東西,我很困惑。 – ElektroStudios