Microsoft Graph的用户信息

时间:2018-08-08 14:04:52

标签: c# azure authentication azure-active-directory microsoft-graph

背景信息。
我有一个作为“应用程序服务”托管在Microsoft Azure中的应用程序(MS Teams Bot)。这个应用程序。该应用程序具有其自己的应用程序ID。在其“设置”中,我对“身份验证/授权”进行了修改,使其可以启用,
auth for app service

Azure ad info

因此,我已经在Azure中的现有应用程序服务中创建了一个新的Azure Active Directory应用程序。现在,此应用程序具有其自己的应用程序ID和密钥。多租户功能已在此启用。
azure app id
此应用程序具有以下权限,
azure app permissions
应用程序权限。
app permissions
委派的权限。
enter image description here
问题。
我在Azure中有2个无关的环境。一个(我们可以称为Azure A)用于托管测试应用程序,另一个(Azure B)用于托管实时应用程序,并且托管于我们的实时活动目录。我的机器人应用程序在Azure A中,但是当来自Azure B的用户使用该机器人时,该机器人尝试根据其来自的活动目录对用户进行身份验证,但无法这样做。我的机器人应用程序获得了一个访问令牌,可以针对它成功获取的api“ https://graph.microsoft.com”运行。 在这里,我有一个类,该类为我的机器人应用程序运行提供访问令牌,

class AzureAuthenticationProvider : IAuthenticationProvider
    {
        public async Task AuthenticateRequestAsync(HttpRequestMessage request)
        {
            string clientId = "client-id";   // azure ad app id
            string clientSecret = "client-secret";   // azure ad app secret

            string authority = "https://login.microsoftonline.com/tenant-id"; // Authentication URI. tenant-id taken from Azure B

            AuthenticationContext authContext = new AuthenticationContext(authority);

            ClientCredential creds = new ClientCredential(clientId, clientSecret);

            AuthenticationResult authResult = await authContext.AcquireTokenAsync("https://graph.microsoft.com/", creds);

            request.Headers.Add("Authorization", "Bearer " + authResult.AccessToken);
        }
    }    

然后我运行以下命令,尝试从Azure B访问用户信息,

GraphServiceClient client = new GraphServiceClient(new AzureAuthenticationProvider());
                string userId = user object id from Azure B;
                User user = await client.Users[userId].Request().GetAsync();    

然后我收到以下错误,

Microsoft.Graph.ServiceException: Code: Authorization_IdentityNotFound Message: The identity of the calling application could not be established.    

我的问题是,
i)AuthenticateRequestAsync()中使用的客户端ID和密码应该是Azure Active Directory应用程序的,还是应该从我的机器人应用程序中获取的?这两个在Azure A中的同一应用程序服务中运行。
ii)如果Azure Active Directory应用程序启用了多租户,它是否能够针对我域外的Active Directory中的用户进行身份验证?
iii)我怀疑身份验证URI必须包含用户来自的位置的租户ID(Azure B),而不是包含应用程序托管的位置的租户ID(Azure A),这是正确的吗?

1 个答案:

答案 0 :(得分:0)

  1. 通过AAD注册:

    • clientid = AAD应用程序的应用程序ID。
    • clientSecret = AAD应用程序生成的密钥。
  2. 是的,这是多租户解决方案的用例之一。

  3. 在这种情况下,您要使用/common endpointhttps://login.microsoftonline.com/common)。这将根据用户所在的住户对用户进行身份验证。

    如果它是单租户应用程序,则可以使用/{tenant-id}代替/common。另外,请注意/common OAuth流不支持client_credential端点。