简短回答: 应用程序和服务主体绝对是两个不同的事物(以1:多方式相关但绝对是不同的对象)。
使用Azure AD Graph API
查找应用程序。如你在问题中提到的。
https://graph.windows.net/<tenantName>/applications?api-version=1.6&$filter=displayName eq '<Apllication Name>'
查找服务主体
https://graph.windows.net/<tenantName>/servicePrincipals?api-version=1.6&$filter=displayName eq '<Apllication Name>'
JSON中需要注意的小细节:
objectId
和objectType
在应用程序对象和服务主体对象中是不同的,您可以从上述查询中获取这些对象。
- 像
appId
和displayName
这样的属性是相同的,因为它们与同一个逻辑应用程序相关联。
关于“AppID和ServicePrincipalID(以及ClientID、ObjectID)之间的关系”的问题
首先,您问题中的链接Azure Active Directory中的应用程序和服务主体对象是了解概念的好资源。我不会比该文档更好地解释概念,所以如果需要,请多次阅读。但是,我将尝试突出一些信息来回答您的特定查询。
您可以将从Azure AD Graph API检索到的应用程序对象(或在Azure门户中的“应用注册”部分查看)视为正在开发并向Azure AD注册进行身份验证目的的软件应用程序的单个和主要定义。注意:在多租户应用程序的情况下,您只会在“主”租户中找到此应用程序对象,在该租户中,应用程序已在Azure AD中注册。
服务主体(Service Principal)是Azure门户中企业应用程序部分下可见的内容,与之相关的是Azure AD租户中将要使用此应用程序的内容。对于“主”租户,服务主体在应用程序注册时创建,而对于所有其他租户,在同意时创建服务主体。
因此,将始终只有一个应用程序对象来表示应用程序。在应用程序注册时至少会创建1个服务主体。尽管如此,当您从多个租户使用多租户应用程序时,每个新的Azure AD租户都会为用户授权应用程序创建1个服务主体。因此,应用程序和服务主体对象之间的关系变为1:多
appId
将是表示此应用程序的单个应用程序对象以及为此应用程序创建的所有服务主体的相同值。
objectId
将是应用程序对象和每个服务主体的唯一值。这在Azure AD中唯一标识该对象。这是您将在所有Azure AD对象(例如用户、组或任何其他Azure AD对象)中找到的属性。
clientId
将与appId
相同。在获取使用Azure AD支持的OAuth流之一(例如在使用ADAL库编写代码或使用REST API命中Azure AD令牌端点时)的令牌时,它将是相关的上下文。对于应用程序或服务主体对象,您不会直接找到具有该名称的属性。
顺便说一下,你困惑的另外两个链接更多地是如何文章,试图完成工作,而不是深入解释你正在寻找的概念。我不认为任何文档会明确表示应用程序和服务主体是同一事物(因为它们在技术上并不是)。尽管我可以理解有时会感到困惑,当应用程序和服务主体在身份验证相关任务的上下文中松散地互换使用时。
这里是另一个SO帖子,涉及类似的主题,由Jean-Marc Prieur提供了很好的答案。它可能无法回答您所有特定的问题,但肯定涵盖了这些概念。