缺少Microsoft Graph ServicePrincipal

时间:2017-04-07 08:56:16

标签: powershell azure azure-active-directory azure-ad-graph-api

TL; TR 我们正在使用Microsoft Graph API创建AAD应用程序。该应用程序有一些 requiredResourceAccess 条目,其中一个需要访问微软图。 创建应用程序后,我们希望使用 appRoleAssignments 对象将角色分配给服务主体。该对象需要 resourceId ,这是我试图确定的objectId(例如微软图)。

我们正在使用Graph API本身来获取服务主体:https://graph.windows.net/<tenant>/servicePrincipals?api-version=1.6但不知何故 Microsoft Graph 缺失:

Windows Azure Active Directory      
Microsoft App Access Panel          
Azure Classic Portal                
Microsoft.SMIT                      
Office 365 Configure                
Windows Azure Service Management API
Microsoft.SupportTicketSubmission   
Azure ESTS Service                  
Signup                              
Microsoft password reset service  

我需要确定 Microsoft Graph 服务主体 ObjectId 。从新的AAD开始,似乎没有Microsoft Graph Principal:

Get-MsolServicePrincipal -AppPrincipalId 00000003-0000-0000-c000-000000000000

输出

Get-MsolServicePrincipal : Service principal was not found.

如何确定Microsoft Graph的ObjectId(最好使用 graph.windows.net API)?

修改1:

根据费雪的建议,使用以下方式通过休息创建服务主体:

POST: https://graph.windows.net/{tenantId}/servicePrincipals?api-version=1.6

Authorization: Bearer {access_token}

{
  "appId": "00000003-0000-0000-c000-000000000000",
  "accountEnabled": true
}

给我 400 (错误请求)错误代码:

enter image description here

2 个答案:

答案 0 :(得分:4)

  

我需要确定Microsoft Graph Service Principal的ObjectId。从新的AAD开始,似乎没有Microsoft Graph Principal:

在用户同意应用程序后,将在其他租户上注册的多租户应用程序(Microsoft Graph)的服务主体创建。这就是为什么你无法在新租户中找到它的原因。

要获取Microsoft Graph的对象ID,您需要注册并向其授予Microsoft Graph权限,如下图所示:

enter image description here

之后,Get-MsolServicePrincipal命令应该适合您(注意:您可能需要在授予权限后等待几秒钟。)

有关服务主体的更多详细信息,您可以参考this document

更新

POST: https://graph.windows.net/{tenantId}/servicePrincipals?api-version=1.6

Authorization: Bearer {access_token}

{
  "appId": "00000003-0000-0000-c000-000000000000",
  "accountEnabled": true
}

UPDATE2

上述REST使用在Microsoft租户上注册的应用程序(1950a258-227b-4e31-a9cf-717495945fc2)来获取令牌。要以实用方式创建Microsoft Graph的服务主体,我们可以调用New-AzureRMADServicePrincipal命令。

这是一个适合我的C#代码示例:

try
{
    var userName = "";
    var password = "";
    var securePassword = new SecureString();
    foreach (char c in password)
    {
        securePassword.AppendChar(c);
    }

    // Create Initial Session State for runspace.
    InitialSessionState initialSession = InitialSessionState.CreateDefault();
    // Create credential object.
    PSCredential credential = new PSCredential(userName, securePassword);
    // Create command to Log in to Azure.
    Command connectCommand = new Command("Login-AzureRmAccount");
    connectCommand.Parameters.Add((new CommandParameter("Credential", credential)));
    // Create command to create service principal.
    Command createSP = new Command("New-AzureRMADServicePrincipal");
    createSP.Parameters.Add(new CommandParameter("ApplicationId", "00000003-0000-0000-c000-000000000000"));
    using (Runspace psRunSpace = RunspaceFactory.CreateRunspace(initialSession))
    {
        // Open runspace.
        psRunSpace.Open();

        //Iterate through each command and executes it.
        foreach (var com in new Command[] { connectCommand, createSP})
        {
            var pipe = psRunSpace.CreatePipeline();
            pipe.Commands.Add(com);
            pipe.Invoke();

        }
        // Close the runspace.
        psRunSpace.Close();
    }
}
catch (Exception)
{
    throw;
}

答案 1 :(得分:0)

Get-MsolServicePrincipal -All | ? {$_.Displayname -match 'graph'} | ft ObjectID,AppprincipalID,DisplayName -AutoSize