缺少 Microsoft Graph ServicePrincipal

Missing Microsoft Graph ServicePrincipal

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

我们正在使用 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.netAPI)?


编辑 1:

根据 Fei Xue 的建议,通过 Rest 创建服务主体使用:

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

Authorization: Bearer {access_token}

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

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

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

I need to determine the ObjectId of the Microsoft Graph Service Principal. Starting with a fresh AAD, it seems like there is no Microsoft Graph Principal:

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

要获取Microsoft Graph的object id,需要注册并授予Microsoft Graph的权限,如下图:

之后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
}

更新2

以上REST使用在微软租户上注册的app(1950a258-227b-4e31-a9cf-717495945fc2)获取token。要实用地为 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;
}