Azure AD:当appRoleAssignmentRequired = true

时间:2017-01-11 08:55:12

标签: c# azure azure-active-directory azure-ad-graph-api

我们在Azure AD中有一个注册的Web应用程序,需要有效的Bearer OAuth令牌才能继续。通常,身份验证流程来自Javascript UI,OAuth令牌从中间件传递到目标Web API REST服务应用程序,它会针对ValidAudiences验证令牌,一切正常。

现在,我们有一个非用户消费者:另一个需要访问此应用的服务。为此,我们创建了一个新的" Native" Azure AD中的应用程序,带有用于身份验证的密钥(密钥)。该应用有三个API权限:Azure Active DirectoryWindows 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是否支持添加应用程序?它会解决我们的限制访问问题吗?

谢谢, 维塔利彼得

1 个答案:

答案 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}"
}