【问题标题】:User information from Microsoft Graph来自 Microsoft Graph 的用户信息
【发布时间】:2018-08-08 14:04:51
【问题描述】:

背景信息。
我有一个作为“应用服务”托管在 Microsoft Azure 中的应用程序(MS Teams Bot)。这个应用程序。此应用程序有自己的应用程序 ID。在其“设置”中,我已将“身份验证/授权”修改为启用,

因此,我在 Azure 中现有的应用服务中创建了一个新的 Azure Active Directory 应用程序。现在这个应用程序有自己的应用程序 ID 和密钥。多租户功能已在此启用。

此应用具有以下权限,

应用程序权限。

委派权限。

问题。
我在 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 应用程序,还是应该从我的机器人应用程序中获取?这 2 个在 Azure A 的同一个应用服务中运行。
ii) 如果 Azure Active Directory 应用程序启用了多租户,它是否能够针对来自我域外部的 Active Directory 的用户进行身份验证?
iii) 我怀疑身份验证 URI 必须包含用户来自 (Azure B) 的租户 ID,而不是托管应用程序 (Azure A) 的租户 ID,这是正确的吗?

【问题讨论】:

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


    【解决方案1】:
    1. 来自 AAD 注册:

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

    3. 在这种情况下,您想使用/common endpoint(https://login.microsoftonline.com/common)。这将针对他们居住的租户对用户进行身份验证。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 2023-01-12
      • 1970-01-01
      相关资源
      最近更新 更多