NameIdentifier和ObjectIdentifier的区别

27

我有一个使用OpenIdConnect和Azure AD作为Office 365身份提供者的多租户ASP.NET应用程序。当用户经过认证后,我会在ClaimsPrincipal.Current中接收到我的声明。

我想要识别用户并将这个ID引用存储在我的数据库中。我发表了这个问题。 有人回答说:

当尝试唯一地标识一个用户时,[NameIdentifier] 应该是您的首选。

但似乎NameIdentifier声明,即http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier,取决于应用程序。准确地说,如果我在Azure AD中创建另一个应用程序,则对于同一个真实的Office365用户来说,NameIdentifier将不会是相同的。请记住,我们可能需要创建另一个Azure AD清单(因为我们可能需要其他范围),并且我们应该能够找回相同的最终用户。

与此同时,我注意到另一个声明:ObjectIdentifier http://schemas.microsoft.com/identity/claims/objectidentifier

看起来ObjectIdentifier对于给定Office 365用户的所有Azure AD安全应用程序都是相同的。

您能够准确地解释这两个声明之间的区别吗?更重要的是,您能够确认ObjectIdentifier可以作为任何Office 365订阅中用户的“通用”标识符吗?

2个回答

3
确切地说,如果我在Azure AD中创建另一个应用程序,则对于同一真实的Office365用户,NameIdentifier将不相同。
我进行了快速测试:
在AD Contoso中注册多租户Web应用和单租户Web应用。
使用user1@contoso.onmicrosoft.com登录并获取两个Web应用程序中的名称标识符,结果发现名称标识符在两个应用程序中都相同。因此,名称标识符应该能够跨应用程序识别用户,但不能用于在Azure AD中识别用户。
对于对象标识符,它是一个GUID,可用于在Azure AD中标识用户。例如,您可以使用对象标识符查询Azure AD中的用户。
PowerShell:
$msolcred = get-credential
connect-msolservice -credential $msolcred
get-msoluser -ObjectId "{guid:object_identifier}"  

更重要的是,您能否确认ObjectIdentifier可以作为任何Office 365订阅中用户的“通用”标识符。

根据我的理解,对象标识符是一个GUID,可以在Office 365订阅中标识用户。


2
嗨,杰弗里,感谢你的回答。我可以确认,从我的角度来看,我收到了不同的NameIdentifier。我的两个应用程序都是多租户的,并且它们的范围不同:其中一个使用Groups.ReadAll(在Graph API中读取所有组)。你需要这些应用程序清单吗? - Benoit Patra
@Benoit,感谢您提供详细的信息。我将尝试对名称标识符进行更多测试。但是对于对象标识符,它是Azure AD中的实际ID,您可以使用此ID通过PowerShell在Azure AD中查询用户。 - Jeffrey Chen

-3
换句话说: NameIdentifier 是在 Azure AD 中注册的应用程序的 GUID。无论是单租户还是多租户应用程序,这都不会改变。如果您使用客户端凭据(即 AppId 和 AppSecret)对应用程序进行身份验证或者使用实际用户凭据(即委派)进行日志记录,NameIdentifier 都将保持不变。 ObjectIdentifier 是使用委派时用户的用户主体名称 (UPN),或使用客户端凭据时应用程序的服务主体名称 (SPN)。
当应用程序是多租户时,您看到不同的 ObjectIdentifier 值是因为每个租户中都有一个单独且唯一的 SPN,该 SPN 指向应用程序在注册的租户中的 ApplicationGUID。此 SPN 用于向每个租户的资源分配应用程序权限。

5
NameIdentifier 并不是应用程序的 GUID,而是与用户关联的唯一标识符,在该用户通过隐式流(implicit flow)进行身份验证时使用。它在应用程序的范围内保证是唯一的。这就是为什么,如果你重新创建应用程序,你将会得到一个不同的 NameIdentifier 来表示相同的用户。 在隐式流中,ObjectIdentifier 是用户在其租户中的 ObjectId。只要用户在租户中未被重新创建,它始终保持不变。 对我来说,ObjectIDentifier 是最可靠的。 - Loul G.
1
但在多租户应用程序的上下文中,我不知道用户的ObjectId是否保证在所有租户中都是唯一的... - Loul G.
刚刚找到了我的问题的答案 :-). 你可以在这里看一下: [https://learn.microsoft.com/en-us/azure/active-directory/develop/id-tokens#payload-claims]。`sub`声明实际上是`NameIdentifier`声明,而`oid`声明是`ObjectIdentifier`,并且保证在所有Azure租户中都是唯一的。因此,我认为一个好的数据库键候选项,将持久化应用程序重新创建,是由提供商ID (idp) 和对象ID (oid) 组成的一个复合键。 - Loul G.
是的,NameIdentifier不是应用程序的GUID,而是该用户在该应用程序中的标识符。objectId是Azure中该用户的ID(跨所有应用程序)。objectId不是UPN,因为这可以设置为实际的用户帐户...(至少在我的组织中是这样做的)。 - Egli Becerra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接