0

我正在构建一个自定义移动应用程序,它有一个客户端、自定义后端服务器(我正在构建)并与许多其他 api 交互。这些 api 之一是 Microsoft 预订。

我面临的问题是我需要通过服务器到服务器进行身份验证,并使用共享的客户端密码。我知道来自 MS 的众多文档,但尚未找到解决方案。我想知道服务器到服务器是否甚至可以使用 Bookings。

我能够获得具有这些权限的 access_token 服务器到服务器。(我已经在 Azure AD 中授予此应用程序的“所有权限”)。

"roles": [
"Calls.JoinGroupCall.All",
"OnlineMeetings.Read.All",
"OnlineMeetings.ReadWrite.All",
"Application.ReadWrite.OwnedBy",
"Calendars.Read",
"People.Read.All",
"Application.ReadWrite.All",
"Calls.InitiateGroupCall.All",
"Directory.ReadWrite.All",
"Calls.JoinGroupCallAsGuest.All",
"Sites.Read.All",
"Sites.ReadWrite.All",
"Sites.Manage.All",
"Files.ReadWrite.All",
"Directory.Read.All",
"User.Read.All",
"Calendars.ReadWrite",
"Mail.Send",
"ProgramControl.Read.All",
"ProgramControl.ReadWrite.All",
"Calls.Initiate.All"

],

这些是来自解码令牌的权限。当我去调用 Bookings api 时,我收到 401。 在此处输入图像描述

但是,我可以使用此令牌访问不同的图形端点没有问题。

我会注意到,我可以使用我的帐户通过 Graph Explorer 成功调用 bookings api,这与“Azure AD 中的应用程序”无关。

Azure AD 中的此资源是否需要预订许可证?这甚至可能是 S2S 吗?

有没有其他方法可以在没有用户凭据的情况下绕过它?

谢谢。

4

2 回答 2

0

到目前为止,Microsoft Bookings API 似乎不支持“应用程序权限”。

唯一可用的权限是“委派权限”,这意味着您的令牌必须在登录用户的上下文中获取。

以下是我遇到的两个 Microsoft 文档来源:

我知道您提到使用客户端密码的服务器到服务器身份验证。AFAIK,这种情况不会直接起作用,因为 clientId 和 clientSecret 仅提供应用程序的身份(无法分配任何权限,因为此 API 没有相关的应用程序权限)。

以防万一您可能涉及一些用户上下文,这里是来自上面预订示例链接的代码,用于使用 ADAL 在本机应用程序中获取令牌

var authenticationContext = new AuthenticationContext("https://login.microsoftonline.com/common/");

var authenticationResult = await authenticationContext.AcquireTokenAsync(
  "https://graph.microsoft.com/",
  clientApplication_ClientId,
  clientApplication_RedirectUri,
  new PlatformParameters(PromptBehavior.RefreshSession));

// The results of this call are sent as the Authorization header of each HTTPS request to Graph.
var authorizationHeader = authenticationResult.CreateAuthorizationHeader();

关于如何使这种情况发挥作用的建议

  1. 代表流量

    您的移动应用程序客户端可以提示用户输入凭据以代表用户执行操作并调用您的后端 Web API,后者又调用下游 API,如 Bookings API。这被称为代表用户的服务到服务调用

    这是一个代码示例,它通过本机应用程序 (WPF) 和 SPA 准确显示了这一点。在您的情况下,只需将 WPF 应用程序替换为您的移动客户端应用程序以了解目的,其余场景将变得非常相似。

    使用 Azure AD 从 Web API 调用下游 Web API

    在此处输入图像描述

  2. ROPC 补助金(不推荐)

    Resource Owner Password Credentials grant 可以提供帮助,因为您的应用程序可以使用最终用户密码,但它有多个问题,任何安全指南都会阻止您使用它。

    ROPC 会带来安全风险,不遵循最佳实践并且也存在功能问题。ROPC 不适用于启用 MFA 的用户以及联合身份验证用户。

    出于所有实际目的,您应尽可能避免使用 ROPC。您可以在 ADAL 文档本身和来自 Microsoft 的多个其他文档中找到相同的建议,甚至通常关于 OAuth 2.0。

于 2018-11-13T23:54:03.487 回答
0

因此,由于 MS doc 的噩梦,我花了一个多星期的时间试图解决这个问题。我只是发帖帮助别人!

Bookings 尚不支持服务到服务。因此,如果您不想在没有用户实际登录的情况下实现这一点,IE。如果您有专用的预订管理员帐户凭据,则必须对客户凭据进行硬编码。

我在这里找到了答案https://stackoverflow.com/a/49814924/9105626 在此处输入图像描述

于 2018-11-14T00:14:00.307 回答