【问题标题】:Authenticate App Services backend using Microsoft Graph token?使用 Microsoft Graph 令牌对应用服务后端进行身份验证?
【发布时间】:2017-10-27 11:58:37
【问题描述】:

编辑:

我已添加“id_token”,但仍收到“未授权”响应。 这是我的登录代码:

PublicClientApplication myApp = new PublicClientApplication("My-AppID-From-App-Registration-Portal");
string[] scopes = new string[] { "User.Read" };
AuthenticationResult authenticationResult = await myApp.AcquireTokenAsync(scopes).ConfigureAwait(false);

JObject payload = new JObject();
payload["access_token"] = authenticationResult.AccessToken;
payload["id_token"] = authenticationResult.IdToken;

user = await MobileService.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount, payload);

原帖:

是否可以使用从 Microsoft Graph 检索到的令牌对应用服务后端进行身份验证? 我已经尝试使用此令牌并以 AzureActiveDirectory 作为提供者调用 LoginAsync(),这不起作用。

JObject payload = new JObject();
payload["access_token"] = GraphAuthenticationHelper.TokenForUser;
user = await MobileService.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, payload);

这可能吗?

【问题讨论】:

  • 我认为您想使用 WindowsAzureActiveDirectory 作为提供程序参数。此外,在门户中打开应用程序日志记录,您应该能够看到一条警告消息,其中包含未授权响应的原因。你也可以分享这些信息吗?
  • 好吧,即使使用 MSA 帐户?无论哪种方式,两者都不起作用。在“LogFiles/DetailedErrors”下,我得到以下信息: HTTP 错误 401.83 - 未经授权 最可能的原因:经过身份验证的用户无权访问处理请求所需的资源。详细错误信息:Module EasyAuthModule_32bit Notification BeginRequest Handler ExtensionlessUrlHandler-Integrated-4.0 Error Code 0x80004005 Requested URL myapp__9131:80/.auth/login/aad Physical Path D:\home\site\wwwroot\.auth\login\aad
  • 抱歉,我应该更具体一些。您需要查看 application 日志(诊断日志 --> 应用程序日志记录(文件系统))。我认为您正在查看的是 Web 服务器日志。顺便说一句,这是一个同时支持 AAD 和 MSA 的融合 AAD 端点,对吧?
  • 是的,它确实是一个“融合”应用程序,而不是一个“Live SDK”应用程序。我确实启用了应用程序日志记录(文件系统),但是当我 FTP 进入时甚至没有看到“应用程序日志”文件夹。
  • 如果您重现启用日志记录的问题,您肯定会看到日志。使用 Kudu 门户时,可以在 D:\home\LogFiles\Application\ 下找​​到它们。

标签: azure azure-mobile-services microsoft-graph-api adal


【解决方案1】:

我认为没有,请参考文档:https://docs.microsoft.com/en-us/azure/app-service-mobile/app-service-mobile-dotnet-how-to-use-client-library#a-nameauthenticationaauthenticate-users

将 INSERT-RESOURCE-ID-HERE 替换为您的移动应用后端的客户端 ID。您可以从门户中 Azure Active Directory 设置下的“高级”选项卡获取客户端 ID。

访问令牌的受众应该是您的移动应用后端的客户端 ID。因此,如果资源是 https://graph.microsoft.com/(aud 在访问令牌中声明),则客户端管理的身份验证将不起作用。

【讨论】:

  • 本文档说“首选客户端流程”,然后继续链接我认为已弃用的 Live SDK。所有这些文档中的混合信息量真的很难理解。 App Services 是 Microsoft 服务,MSGraph API 也是如此。我希望这两者能够优雅地合作。感谢 Chris Gillum 的一篇文章,我可以使用 Azure AD 帐户:stackoverflow.com/questions/44010063/… 但是,这不适用于 Microsoft 帐户,知道为什么吗?
【解决方案2】:

更新:在我原来的回答中,我说你不能这样做。但实际上,您可以这样做,但这样做很危险,因为理论上任何拥有有效 Microsoft Graph 令牌的人都可以访问您的 API。在我带你走这条路之前,让我描述一下代表你的最终用户访问 Microsoft Graph 的“正确”方式。

执行此操作的正确方法是使用移动后端代码中的代表流程将用户的 ID 令牌交换为 Microsoft Graph 令牌。流程如下所示:

  1. 客户端使用 MSAL 启动 AAD 登录,并将资源设置为移动后端(而不是图形)。结果应该是一组标记。
  2. 客户端使用移动 SDK 使用来自 #1 的 access_token 和 id_token 进行登录。

示例代码:

JObject payload = new JObject();
payload["access_token"] = {access_token.from.msal};
payload["id_token"] = {id_token.from.msal};
var user = await MobileService.LoginAsync(
    MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory,
    payload);
  1. 后端代码将用户的 ID 令牌(来自 x-ms-token-aad-id-token 请求标头)交换为图形令牌。这种代币交换被称为“代表”,并记录在here。我认为这可以使用 ADAL 或 MSAL 库来完成,但我找不到文档。它也很简单,您可以直接实现 HTTP 协议而无需太多麻烦。
  2. 后端使用新获取的 MS Graph 令牌并进行图 API 调用。

您还可以在后端缓存您获取的图形令牌,这样每个 API 调用就不需要更多的 AAD API 调用来进行令牌交换。

【讨论】:

  • 感谢克里斯的回复。因此,如果我将图形令牌与我的 API 调用一起传递,这意味着我必须对用户进行两次身份验证,一次用于应用服务,另一次用于获取图形令牌。它是否正确?我在上述评论中链接的您的解决方案非常适合 AAD,我很困惑为什么它对 Microsoft 帐户不那么直接。特别是因为它被吹捧为 MSA 和 AAD 的一个端点。 WA 希望为用户提供一次登录,用于 MSA 和 AAD,可用于针对 App 服务进行身份验证,也可以访问 MS Graph。
  • 您不需要根据我的建议进行两次身份验证。您的后端将按原样接受令牌并使用它对 MS Graph API 进行 API 调用。 TBH,我很惊讶我的链接解决方案完全适用于带有 v2 端点的 AAD。总的来说,AAD 正在远离“资源”模型,这就是为什么它不适用于 MSA 帐户(AAD v1 根本不支持 MSA)我并不完全感到惊讶。
  • 抱歉,克里斯,我不明白。我应该为 MSA 使用哪个客户端流?我已经尝试过 MSAL,但从中检索到的令牌并未针对应用服务进行身份验证。我将它作为 JObject 中的“access_token”传递给 AzureMobileClient.LoginAsync() 方法。我收到未经授权的回复。所有文档都指向使用即将推出的 Live SDK。我应该使用它吗?这是唯一的方法吗?
  • 看来我什至不能使用 Live SDK 进行身份验证,因为我的应用程序在“融合应用程序”下注册,而不是在 apps.dev.microsoft.com 注册中的“Live SDK 应用程序”下注册门户网站。即使“实时 SDK 支持”复选框处于活动状态,我也会收到 Microsoft.Live.LiveAuthException:应用程序未正确配置为使用 Live Connect 服务。即将完全放弃访问图表。
  • 啊,让我更新我的答案。我想我可能之前说错了。你说得对,我提到的方法需要两次登录,这并不理想。实际上还有另一种方法可以使这项工作......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 2019-08-31
  • 1970-01-01
相关资源
最近更新 更多