我正在使用Azure AD B2C对我的移动应用程序的用户进行身份验证。我在设备AcquireTokenSilent
和AcquireTokenInteractive
上使用Microsoft.Identity.Client来管理用户身份验证状态。一切正常。
用户完成身份验证后,我的服务器将检查其ID以查看其是否已在我的用户数据库中注册,如果没有,则将询问其详细信息并保存。此时,我为用户提供了一个本地唯一ID,我想将其添加到他们的访问令牌中,以便其他服务可以将其用于授权。因此,我调用AD B2C图形API来设置UserId自定义属性。我已在Azure AD B2C中注册了自定义属性,并且我的用户流都在“应用程序声明”下选择了UserId,以便将其添加到JWT。我基本上遵循此处描述的选项1:Add claims into token Azure B2C。配置似乎正确,并且一切正常……
...除了一件事。仅在用户注销并再次登录后,UserId声明才会出现在访问令牌中。
因此,在用户进行身份验证之后,我将其注册到数据库中,调用Graph API来设置其UserId声明。此后,无论何时我在设备上获取令牌,即使我使用WithForceRefresh(true)
,也都会获得没有UserId声明的令牌。如果我调用Graph API,则可以看到该声明存在于用户的个人资料中,但并未包含在令牌中。一旦用户注销并再次登录,他就会获得一个包含索赔的令牌。
要解决此问题,我要么需要强迫用户在注册后再次登录,这真是愚蠢。或者,如果令牌中不存在缺少的信息,那么我需要调用Graph API并填写缺少的信息,这也不是最理想的。
我在这里想念什么?强制AD用新声明刷新用户的访问令牌而不要求用户再次登录的正确方法是什么?
更新 为了简单起见,我使用了UserId的示例,但是正如Jas指出的那样,我可以设置静态字段,例如使用REST API声明交换进行注册时。为了使我的问题更加完整,让我补充说,我也希望能够在初次注册后更新声明。例如,可以在初始注册时为用户分配一个角色,然后在以后将其转移到其他角色。我想更新用户的声明,以便可以根据用户访问令牌中更新的声明对用户执行授权。但是,如果我不能保证这些声明始终是最新的,那么我将需要回退到我自己的数据库/服务,这将使AD B2C有效地成为没有授权实用程序的身份验证提供程序。
答案 0 :(得分:2)
您应该将逻辑转移到B2C用户流程中,这将全部解决而不是在身份验证之后执行。 B2C尚未刷新刷新令牌流上的令牌声明(尚未)。
https://docs.microsoft.com/en-gb/azure/active-directory-b2c/rest-api-claims-exchange-dotnet