【问题标题】:NameIdentifier vs ObjectIdentifierNameIdentifier 与 ObjectIdentifier
【发布时间】:2016-04-20 14:50:01
【问题描述】:

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

我想识别一个用户并将这个 id 引用存储在我的数据库中。我问了this question。 有人回复说

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

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

同时,我评论了另一个声明:ObjectIdentifierhttp://schemas.microsoft.com/identity/claims/objectidentifier

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

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

【问题讨论】:

    标签: azure-active-directory claims-based-identity office365api azure-ad-graph-api


    【解决方案1】:

    确切地说,如果我在 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 订阅中的用户。

    【讨论】:

    • 您好杰弗里,谢谢您的回答。我可以确认,就我而言,我收到了不同的 NameIdentifier。我的两个应用程序都是 MultiTenant,它们与范围不同:其中一个是使用 Groups.ReadAll(读取 Graph API 中的所有组)。你想要这些应用清单吗?
    • @Benoit,感谢您提供的详细信息。我将尝试对名称标识符进行更多测试。但是对于对象标识符,它是Azure AD中的实际id,您可以使用此id在Azure AD中使用Powershell查询用户。
    【解决方案2】:

    或者换一种说法:

    NameIdentifier 是在 Azure AD 中注册的应用程序的 GUID。无论是单租户还是多租户应用程序,这都不会改变。无论您是使用客户端凭据(即 AppId 和 AppSecret)对应用程序进行身份验证还是使用真实用户凭据(即委托)进行日志记录,NameIdentifier 都将保持不变。

    ObjectIdentifier 是使用委托时用户的用户主体名称 (UPN),或者是使用客户端凭据时应用程序的服务主体名称 (SPN)。

    当应用程序是多租户时,您看到不同的ObjectIdentifier 值的原因是每个租户中都有一个单独且唯一的 SPN,它指向注册应用程序的租户中的 ApplicationGUID。此 SPN 用于为应用程序分配针对每个租户中的资源的权限。

    【讨论】:

    • NameIdentifier 不是应用程序的 guid。这是用户对他已通过身份验证的应用程序的唯一 ID(在隐式流程中)。它保证是唯一的,但仅限于应用程序的范围内。这就是为什么如果您重新创建应用程序,您将为同一用户获得不同的NameIdentifier 的原因。在隐式流的情况下,ObjectIdentifier 是其租户中用户的ObjectId。只要不在租户中重新创建用户,它就保证始终相同。对我来说,最可靠的是ObjectIDentifier
    • 但是在多租户应用的上下文中,我不知道用户的ObjectId是否保证在所有租户中都是唯一的...
    • 刚刚找到我的问题的答案:-)。您可以在这里查看:[docs.microsoft.com/en-us/azure/active-directory/develop/…sub 声明实际上是 NameIdentifier 声明,oid 声明是 ObjectIdentifier,并且保证在所有 Azure 租户中都是唯一的。所以我认为数据库中的一个很好的候选者,它将持续应用程序重新创建,是提供者 ID (idp) 和对象 ID (oid) 的组合。
    • 是的 NameIdentifier 不是应用程序的 guid。它在该应用程序 objectId 中该用户的标识符是 Azure 中的用户 ID(跨所有应用程序)对象 ID 不是 UPN,因为这可以设置为实际的用户帐户......(至少他们已经这样做了)我的组织)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 2011-08-14
    • 2017-05-07
    • 1970-01-01
    • 2017-01-27
    • 2021-12-13
    相关资源
    最近更新 更多