【发布时间】: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