2015-05-11 2 views
1

По какой-то причине следующий код дает несанкционированное исключение, может ли кто-нибудь сказать мне, что я делаю неправильно?Office 365 - многопользовательское приложение постоянно дает несанкционированный доступ

На скриншоте ниже вы можете найти содержание «theToken», который был получен через Office365 и сохраняется в базе данных (1 минуту до excecution)

Contents of theToken (obfuscated)

Async Function CalendarDemo() As System.Threading.Tasks.Task(Of ActionResult) 

     Dim tokenData = UserTokenService.GetToken(HttpContext.User.Identity.Name) 

     Dim theToken = tokenData.ReadItems(0) 
     Dim myCalendars As List(Of ViewModels.Office365.MyCalendar) = New List(Of ViewModels.Office365.MyCalendar) 

     Try 

      Dim accessToken As Func(Of String) = Function() As String 
                Return theToken.AccessToken 
               End Function 

      Dim discClient As New DiscoveryClient(New Uri("https://api.office.com/discovery/v1.0/me/"), accessToken) 
      Dim dcr = Await discClient.DiscoverCapabilityAsync("Calendar") 'This is where the code breaks, the code worked in the past. Till i split up the authorization and the fetching of the Calendar 



      ViewBag.ResourceId = dcr.ServiceResourceId 
      Dim exClient As New OutlookServicesClient(dcr.ServiceEndpointUri, Function() 
                        Return Helpers.Office365Helpers.ReturnStringAsAsync(theToken.AccessToken) 
                       End Function) 
      Dim calendarResults = Await exClient.[Me].Events.ExecuteAsync() 
      Dim calenderResults = Await exClient.Me.Calendar.Events.ExecuteAsync() 

      Do 
       Dim calendars = calendarResults.CurrentPage 
       For Each calendar In calendars 
        Dim newCalendar = New ViewModels.Office365.MyCalendar(calendar) 
        myCalendars.Add(newCalendar) 
       Next 

       calendarResults = Await calendarResults.GetNextPageAsync() 
      Loop While calendarResults IsNot Nothing 
     Catch exception As AdalException 
      ' handle token acquisition failure 
      If exception.ErrorCode = AdalError.FailedToAcquireTokenSilently Then 
       'authContext.TokenCache.Clear() 

       'Redirect naar login of refresh token 
       ViewBag.ErrorMessage = "AuthorizationRequired" 
      End If 
     Catch exception As DiscoveryFailedException 

     End Try 

     Return View(myCalendars) 
    End Function 

Исключение составляет : «Исключение типа« Microsoft.Office365.Discovery.DiscoveryFailedException »было брошено». - и ErrorCode является «Несанкционированное»

Согласно ниже ответ, я изменил следующий код:

Dim exClient As New OutlookServicesClient(New Uri("https://outlook.office365.com/api/v1.0/"), Function() 
                              Return Helpers.Office365Helpers.ReturnStringAsAsync(theToken.AccessToken) 
                              End Function) 

Dim calendarResults = Await exClient.[Me].Events.Take(10).ExecuteAsync() 

Где мой помощник:

Public Module Office365Helpers 
    Public Async Function ReturnStringAsAsync(ToReturnString As String) As System.Threading.Tasks.Task(Of String) 


     Return Await System.Threading.Tasks.Task.Delay(1).ContinueWith(Function(dl) ToReturnString) 

    End Function 

End Module 

Но это не возвращает когда он загружается. Это похоже на вызов api в непрерывном цикле.

Identitical вопрос, но короче:

У меня есть Microsoft.IdentityModel.Clients.ActiveDirectory.TokenCache, как я могу запросить API Календаря Microsoft с использованием библиотек и vb.net, чтобы получить данные.

ответ

1

В ODataException в ответе вы можете просмотреть значения заголовков.

Существует ошибка, объясняющая мою ошибку, она сказала что-то в строках: «Непоследовательный ресурс». Это может быть правдой. Я узнал, что я не использовал https://outlook.office365.com/api/v1.0/ при запросе маркера. Но использовал его при запросе данных.

Так что я получил недействительные токены за то, что я пытался сделать.

0

Ваш ресурс должен быть https://api.office.com/discovery/ для вызова службы обнаружения. Однако, поскольку вы вызываете API календаря, вы можете просто пропустить обнаружение. Конечная точка фиксирована на https://outlook.office365.com/api/v1.0/.

Если вы застряли, попробуйте .NET tutorial на https://dev.outlook.com.

+0

Обновлен мой вопрос, я изменил код, но он, похоже, не работает – NicoJuicy

+0

Хорошо, вы можете попробовать начать учебник .NET на нашем сайте и сравнить. Я обновил свой ответ. –

+0

У меня уже есть несколько образцов кода, но он, похоже, не работает должным образом. Учитывая, что у меня есть Microsoft.IdentityModel.Clients.ActiveDirectory.TokenCache (так AccessToken и RefreshToken), сохраненный в базе данных. Как я могу запросить API-интерфейс Outlook Outlook без вызова DiscoveryClient? – NicoJuicy

Смежные вопросы