从不同的用户(会议室)获取共享日历

时间:2016-12-19 10:16:51

标签: c# asp.net-mvc microsoft-graph outlook-restapi

//如何获得不同的用户/会议室日历活动?

我们正在尝试使用图形REST API来获取另一个用户的日历事件(已通过身份验证的用户的共享日历)或会议室(应该是具有共享日历的Active Directory用户,以便组织内的所有用户)。

我们仍然得到"禁止"响应。

我们可以成功获取用户(他自己)经过身份验证的日历活动。

我们还可以获取经过身份验证的用户以及其他用户(用户通过身份验证为John.Doe@company.com并获取elise@doe.company.com的用户详细信息)的用户详细信息,但我们无法获取有关详细信息。会议室用户,即使它应该是我们AD中的普通用户。

我们尝试设置所有委托甚至应用权限范围,没有任何帮助。

示例: var endpoint =" https://graph.microsoft.com/v1.0/users/" + userId +" / calendarView&#34 ;;

有没有办法检索这些信息?

1 个答案:

答案 0 :(得分:1)

问题是您的令牌没有正确的范围。为了能够访问共享日历,您需要Calendars.Read.Shared(或Calendars.ReadWrite.Shared)。如何将该范围纳入您的令牌取决于您注册应用程序的位置(这可以回答您的第一个问题!)

  1. 申请注册的位置和方式是否重要?

    是的,这很重要。这两种方法都有效,但您注册的位置会影响您请求授权和令牌的方式。此外,在Azure管理门户中注册的应用程序只能验证Office 365用户,而不能验证Outlook.com用户。更多关于#2的内容。

  2. 我们使用的身份验证网址是否重要?

    是的!您使用的网址与您注册应用的地点直接相关。我打算在下面打破这个。

  3. 应用范围权限与委派范围权限 - 我们在应用程序中设置了哪些权限?我们所需的功能是否可以使用委派权限?

    是的,这很重要。应用程序权限授予应用程序,对于Outlook API,这些权限对整个组织是全局的。因此,如果您授予应用Mail.Read,它可以读取组织中所有用户的邮件。该应用程序充当自身,不会对用户进行身份验证。因此,auth方法需要证书而不是客户端密钥。此方法适用于守护程序类型的应用程序。您很可能需要委派权限,因为您要对用户进行身份验证,然后授予他们访问权限,以便他们可以查看这些权限。

  4. AD权限是否会以某种方式影响用户在应用程序中的权限?

    是的,从某种意义上说,如果您在权限中包含.Shared范围,那么用户可以访问的内容是由其他用户与他们共享的内容设置的(这与AD绑定)。 / p>

  5. 如何添加共享范围

    正如我上面所说,这对您注册应用的方式很重要。

    Azure管理门户

    Azure管理门户中注册的应用程序使用Azure的OAuth2实施的“v1”版本。在此模型下,您必须在应用注册本身“预先”指定应用的权限。要添加共享权限,您必须在门户中修改应用程序注册。权限在门户中显示为“读取用户和共享日历”(适用于Calendars.Read.Shared)和“读写用户和共享日历”(适用于Calendars.ReadWrite.Shared)。

    如果你的应用是在这里注册的,那么你必须使用v1 auth和token端点:

    https://login.microsoftonline.com/common/oauth2/authorize
    https://login.microsoftonline.com/common/oauth2/token
    

    此外,根据v1方案,如果您在应用注册中添加新范围,则必须让用户重新同意。否则,下次他们登录您的应用时,他们将获得之前相同的权限。为此,在将用户发送到授权端点时,请在授权URL中添加prompt=consent参数。

    应用程序注册门户

    此处注册的应用使用v2 Azure实施并获得一些好处。首先,您可以验证Microsoft帐户(Outlook.com)以及Office 365用户。其次,添加范围不需要修改您的应用注册。最后,您不必手动重新同意用户,auth端点将检测到更改并提示您。

    此处注册的应用使用v2身份验证和令牌端点:

    https://login.microsoftonline.com/common/oauth2/v2.0/authorize
    https://login.microsoftonline.com/common/oauth2/v2.0/token
    

    范围在auth端点的scope URL参数中指定。因此,要添加共享范围,您只需将现有的Calendars.Read和/或Calendars.ReadWrite替换为.Shared等效范围。