我们在Azure AD中有一个注册的Web应用程序,需要有效的Bearer OAuth令牌才能继续。通常,身份验证流程来自Javascript UI,OAuth令牌从中间件传递到目标Web API REST服务应用程序,它会针对ValidAudiences
验证令牌,一切正常。
现在,我们有一个非用户消费者:另一个需要访问此应用的服务。为此,我们创建了一个新的" Native" Azure AD中的应用程序,带有用于身份验证的密钥(密钥)。该应用有三个API权限:Azure Active Directory
,Windows Azure Service Management API
和要访问的应用。
要获取新应用程序的身份验证令牌,我们使用以下代码:
private static async Task<string> Authenticate(
string tenant, string clientId,
string appKey, string resource)
{
var authority = $"https://login.windows.net/{tenant}/oauth2/token";
var credential = new ClientCredential(clientId, appKey);
var authContext = new AuthenticationContext(authority);
var result = await authContext.AcquireTokenAsync(resource, credential);
return result.AccessToken;
}
,tenant
是我们组织的ID(&#34; XXXX.onmicrosoft.com&#34;),clientId
是新服务(消费者)的应用ID, appKey
是生成的密钥,resource
是我们需要访问的目标Web应用程序的应用程序ID。
这是有效的,直到我们遇到通过启用&#34;所需的用户分配来限制对目标应用程序的访问的情况?&#34;在应用设置中明确切换和列出允许的用户。之后,此代码开始失败,并显示以下消息:
Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException: AADSTS50105:应用程序&#39; {我们的客户ID}&#39;未分配给应用程序的角色&#39; {目标网络应用}&#39;。
事实证明,此设置会将目标应用程序的ServicePrincipal中的appRoleAssignmentRequired
属性设置为true
。谷歌搜索确认Azure AD将允许的主体列表存储在应用程序的AppRoleAssignment
实体中。服务负责人,并且不向不在该列表中的客户发放令牌。
似乎没有UI可以将应用程序(而不是用户)添加到该列表中。现在,Azure AD Graph API开始发挥作用。我们可以使用以下查询检查分配的用户列表:
https://graph.windows.net/{tenant}/servicePrincipals/{id}/appRoleAssignedTo
(id
是目标应用程序的服务主体,加上请求应该有一个有效的承载令牌。
不幸的是,我们无法想出任何方式将我们的应用程序(服务主体)添加到此列表中。
我们尝试了Azure AD Graph(graph.windows.net)和Microsoft Graph API(graph.microsoft.com)。 this post中提到了第一种方法,以及它被破坏的注释:
注意:目前,资源的服务主体分配已被破坏,我们将努力解决此问题,并在修复此帖子后对其进行更新。
第二种方法记录为here,并且引用了in this Stack Overflow post,并再次提到存在错误。
我在这里错过了一些非常简单的东西吗? AppRoleAssignment是否支持添加应用程序?它会解决我们的限制访问问题吗?
谢谢, 维塔利彼得
答案 0 :(得分:0)
我们可以使用appRoleAssignedTo
将服务主体分配给另一个服务主体,而不是使用appRoleAssignments
。
以下是供您参考的样本:
POST: https://graph.windows.net/{tenantId}/servicePrincipals/{naiveServicePrincipalId}/appRoleAssignments?api-version=1.6
content-type: application/json
{
"id":"00000000-0000-0000-0000-000000000000",
"principalId":"{naiveServicePrincipalId}",
"principalType":"ServicePrincipa",
"resourceId":"{webAPIServicePrincipalId}"
}