背景信息。
我有一个作为“应用程序服务”托管在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应用程序的,还是应该从我的机器人应用程序中获取的?这两个在Azure A中的同一应用程序服务中运行。
ii)如果Azure Active Directory应用程序启用了多租户,它是否能够针对我域外的Active Directory中的用户进行身份验证?
iii)我怀疑身份验证URI必须包含用户来自的位置的租户ID(Azure B),而不是包含应用程序托管的位置的租户ID(Azure A),这是正确的吗?
答案 0 :(得分:0)
通过AAD注册:
clientid
= AAD应用程序的应用程序ID。 clientSecret
= AAD应用程序生成的密钥。 是的,这是多租户解决方案的用例之一。
在这种情况下,您要使用/common
endpoint(https://login.microsoftonline.com/common
)。这将根据用户所在的住户对用户进行身份验证。
如果它是单租户应用程序,则可以使用/{tenant-id}
代替/common
。另外,请注意/common
OAuth流不支持client_credential
端点。