AAD B2C-缺少访问令牌中的Upn声明

问题描述

我有一个Angular应用程序,该应用程序已使用AAD B2C进行了身份验证。这将使用访问令牌与.Net Core API进行通信。

我的问题是我没有在访问令牌中收到用户主体名称(upn)。

我一直在添加其他“应用程序声明”,例如“给定名称”和“姓氏”,这些都很好地出现在我的访问令牌中!因此,我认为我的范围(openid,个人资料,电子邮件)设置正确,并且理论上可以正常工作。

我相信,因为我使用的是令牌的1.0版,所以不需要在应用程序清单中配置任何其他声明。我的用户是标准AD用户,不是来宾。

以下文档指出upn声明应包含在v1.0令牌中: https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-optional-claims

我在做什么错?!

解码访问令牌:

{
  "iss": "https://(my-tenant-name).b2clogin.com/(guid)/v2.0/","exp": (number),"nbf": (number),"aud": "(guid)","oid": "(guid)","sub": "(guid)","name": "My Name","given_name": "Given name","family_name": "Surname","country": "Norge","tfp": "B2C_1_signupsignin2","nonce": "(guid)","scp": "basic","azp": "(guid)","ver": "1.0","iat": (number)
}

解决方法

根据您提供的代码,我们观察到您正在使用v2端点(“ iss”:“ https://(my-tenant-name).b2clogin.com /(guid)/v2.0/”) 根据{{​​3}},如果您看到iss:If the token was issued by the v2.0 endpoint,the URI will end in /v2.0.

在V2端点中,您需要明确地提出UPN声明请求。

在v1.0端点中,默认情况下会返回它们,但v2.0产生了较小的令牌,因此将其设为可选。

请通过以下链接获取更多信息。 document如何在应用清单https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-optional-claims中添加可选声明

,

目前,同时支持个人帐户和Azure AD(通过应用程序注册门户注册)的应用程序不能使用可选声明。但是,仅使用v2.0终结点为Azure AD注册的应用程序可以获得清单中请求的可选声明。

要在令牌中实现UPN声明,请使用B2C自定义策略。 请参考以下链接以获取入门包:https://github.com/Azure-Samples/active-directory-b2c-custom-policy-starterpack

在技术档案 AAD-UserReadUsingObjectId 和依赖方策略(例如: SignUpOrSignin.xml )中添加以下声明:

<OutputClaim ClaimTypeReferenceId="userPrincipalName" />
,

UPN不会以AAD B2C令牌返回,因为它是设置的无关字符串。

AAD B2C的唯一名称存储在signInNames属性中,并以电子邮件或用户名的形式返回给您。

您链接的文档是针对AAD的,与AAD B2C无关。这是两个单独的令牌发行者服务。在“用户流应用程序声明”中选择以返回“电子邮件地址”。

https://docs.microsoft.com/en-us/azure/active-directory-b2c/user-flow-overview#email-address-storage

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...