C# 当ApprovalSignmentRequired=true时,本机应用程序的Azure AD:AcquireTokenAsync失败

C# 当ApprovalSignmentRequired=true时,本机应用程序的Azure AD:AcquireTokenAsync失败,c#,azure,azure-active-directory,azure-ad-graph-api,C#,Azure,Azure Active Directory,Azure Ad Graph Api,我们在Azure AD中有一个注册的Web应用程序,需要有效的承载OAuth令牌才能继续。通常,身份验证流来自Javascript UI,OAuth令牌从中间件传递到目标Web API REST服务应用程序,它根据有效性验证令牌,一切都很正常 现在,我们有一个非用户消费者:另一个需要访问此应用程序的服务。为此,我们在Azure AD中创建了一个新的“本机”应用程序,该应用程序具有用于身份验证的密钥(机密)。该应用程序有三个API权限:Azure Active Directory、Windows

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

现在,我们有一个非用户消费者:另一个需要访问此应用程序的服务。为此,我们在Azure AD中创建了一个新的“本机”应用程序,该应用程序具有用于身份验证的密钥(机密)。该应用程序有三个API权限:
Azure Active Directory
Windows Azure服务管理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;
}
id
是目标应用程序的服务主体,加上请求应具有有效的承载令牌)

不幸的是,我们无法找到任何方法将应用程序(服务主体)添加到此列表中

我们尝试了Azure广告图(Graph.windows.net)和Microsoft Graph API(Graph.Microsoft.com)。第一种方法在中提到,并在注释中指出它已损坏:

注意:当前服务主体对资源的分配已中断,我们将努力解决此问题,并在修复后更新此帖子

第二种方法被记录在案,并被引用,再次提到有一个bug

我是不是错过了一些很简单的东西?批准是否支持添加应用程序?它能解决我们的受限访问问题吗

谢谢,
Vitaly

我们可以使用
ApprovaliseSignations
将服务主体分配给另一个,而不是使用
ApprovaliseSignedTo

以下是供您参考的样本:

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