2017-05-26 29 views
1

编辑:使用Microsoft Graph令牌验证App Services后端?

我已经添加了“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图形检索到的令牌应用服务后端? 我已经尝试使用此令牌并将AzureActiveDirectory作为提供者调用LoginAsync(),但这不起作用。

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

这可能吗?

+0

我想你想使用WindowsAzureActiveDirectory作为提供者参数。另外,打开门户中的应用程序日志记录,您应该能够看到警告消息以及未经授权的响应的原因。你能分享这些信息吗? –

+0

好的,即使使用MSA帐户?无论哪种方式,两者都不起作用。 在“LogFiles/DetailedErrors”下,我收到以下信息: HTTP错误401.83 - 未经授权 最有可能的原因: 经过身份验证的用户无权访问处理请求所需的资源。 详细错误信息: 模块 EasyAuthModule_32bit 通知 的BeginRequest 处理程序 ExtensionlessUrlHandler集成-4.0 错误代码 0x80004005的 请求的URL 的https:// myapp__9131:80/.auth /登录/ AAD 物理路径 d :\ home \ site \ wwwroot \ .auth \ login \ aad –

+0

对不起,我应该更具体。您需要查看*应用程序*日志(诊断日志 - >应用程序日志记录(文件系统))。我认为你在看的是Web服务器日志。顺便说一下,这是一个支持AAD和MSA的融合AAD端点,对吗? –

回答

1

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

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

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

+0

本文档说“客户端流量优先”,然后继续链接Live SDK,我相信这会被弃用。所有这些文件中的混合信息量实际上很难遵循。 与MSGraph API一样,App Services也是Microsoft Service。我希望这两个人能够一起合作。 感谢Chris Gillum发布的一篇文章,我使用Azure AD帐户: https://stackoverflow.com/questions/44010063/calling-microsoft-graph-api-from-inside-azure-functions/44013797# 44013797 但是,这不适用于Microsoft帐户,有什么想法为什么? –

2

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

要做到这一点的正确方法是使用移动后端代码中的代表流代码来交换Microsoft Graph令牌的用户ID令牌。流程如下所示:

  1. 客户端启动与AAD使用MSAL登录,并将资源向移动后端(而不是图表)。结果应该是一组令牌。
  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); 
  • 后端代码交换用户的ID令牌(从x-ms-token-aad-id-token请求头),用于图令牌。该令牌交换被称为“代表”,并且被记录为here。我认为这可以使用ADAL或MSAL库来完成,但我无法找到文档。它也很简单,你可以直接实现HTTP协议,而不会有太多的麻烦。
  • 后端使用新获取的MS Graph令牌并进行图API调用。
  • 您还可以在后端缓存您获取的图形令牌,以便每个API调用不需要更多的AAD API调用来执行令牌交换。

    +0

    感谢Chris的回复。 因此,如果我将图形标记与我的API调用一起传递,那意味着我必须两次验证用户,一个用于App Services,另一个用于获取Graph标记。它是否正确? 您在上述评论中链接的解决方案对于AAD非常适用,我很困惑为什么它不像Microsoft帐户那么简单。特别是因为它被吹捧为MSA和AAD的一个终点。 WAs希望为用户提供一个登录名,用于MSA和AAD,可用于对App服务进行身份验证,并访问MS Graph。 –

    +0

    您不需要使用我的建议进行两次验证。您的后端将仅接受令牌,并使用它来调用MS Graph API的API。 TBH,我很惊讶我的链接解决方案对AAD w/v2端点有效。总的来说,AAD正在摆脱“资源”模式,这就是为什么我不完全惊讶它不适用于MSA账户(MSA在AAD v1中完全不受支持)。 –

    +0

    我的歉意克里斯,我不明白。 我应该使用哪种客户端流程用于MSA? 我试过MSAL,但从它检索到的令牌没有通过App服务进行认证。我将它作为JObject中的“access_token”传递给AzureMobileClient.LoginAsync()方法。我收到了未经授权的回复。所有文档都指出使用Live SDK即将推出。我应该用它吗?这是唯一的方法吗? –