Office 365 - 多租户应用程序不断授予未授权

时间:2015-05-11 15:45:24

标签: azure outlook office365

出于某种原因,以下代码给出了未经授权的例外,任何人都可以告诉我我做错了什么吗?

在下面的屏幕截图中,您可以找到" theToken"的内容,这些内容已通过Office365接收并保存在数据库中(在执行前1分钟)

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调用是连续循环一样。

同样的问题,但更短:

我有一个Microsoft.IdentityModel.Clients.ActiveDirectory.TokenCache,如何使用DLL&vs.net查询Microsoft Calendar API以获取数据。

2 个答案:

答案 0 :(得分:1)

在ODataException中,在响应中,您可以查看标题值。

那里有一个错误解释了我的错误,它说的是:"不一致的资源"。这可能是真的。我发现在请求令牌时我没有使用https://outlook.office365.com/api/v1.0/。但在请求数据时使用它。

所以我收到了无效的令牌,因为我试图做的事情。

答案 1 :(得分:0)

您的资源应为https://api.office.com/discovery/,以便调用Discovery服务。但是,由于您正在调用Calendar API,因此您可以跳过发现。端点固定为https://outlook.office365.com/api/v1.0/

如果您遇到问题,请尝试.NET tutorial上的https://dev.outlook.com