NameIdentifier vs ObjectIdentifier

Ben*_*tra 17 claims-based-identity azure-active-directory office365api azure-ad-graph-api

我有一个多租户ASP.NET应用程序使用OpenIdConnect和Azure AD作为Office 365的身份提供程序.当用户通过身份验证后,我收到了我的声明ClaimsPrincipal.Current.

我想识别用户并将此id引用存储在我的数据库中.我问了这个问题.有人回答说

当尝试唯一地识别用户时[NameIdentifier]应该是您的首选.

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

与此同时,我评论了另一个主张: ObjectIdentifier http://schemas.microsoft.com/identity/claims/objectidentifier

ObjectIdentifier对于给定的Office 365用户,所有Azure AD保护的应用程序似乎都是相同的.

你能准确解释这两种说法之间的区别吗?更重要的是,您是否可以确认ObjectIdentifier可以在任何Office 365订阅中将其用作用户的"通用"标识符.

Jef*_*hen 4

准确地说,如果我在 Azure AD 中创建另一个应用程序,那么对于同一个真实的 Office365 用户来说,NameIdentifier 将不相同。

我做了一个快速测试如下:

在 AD Contoso 中注册多租户 Web 应用程序和单租户 Web 应用程序。

使用 user1@contoso.onmicrosoft.com 登录并获取两个 Web 应用程序中的名称标识符,结果发现两个应用程序中的名称标识符是相同的。所以名称标识符应该能够跨应用程序识别用户,但不能用于识别Azure AD中的用户。

对于对象标识符,它是一个 GUID,可用于识别 Azure AD 中的用户。例如,您可以使用对象标识符来查询 Azure AD 中的用户。

电源外壳:

$msolcred = get-credential
connect-msolservice -credential $msolcred
get-msoluser -ObjectId "{guid:object_identifier}"  
Run Code Online (Sandbox Code Playgroud)

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

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

  • 嗨,杰弗里,谢谢您的回答。我可以确认,从我这边,我收到了不同的 NameIdentifier。我的两个应用程序都是多租户的,并且它们的范围不同:其中之一使用 Groups.ReadAll (读取 Graph API 中的所有组)。您想要这些应用程序清单吗? (2认同)