如何在Azure AD B2C中添加用户最后登录日期?Graph API无返回该属性
问题分析与解决方案
你遇到的核心问题是:自定义声明extension_LastLogin在用户流程中被正确生成并返回(所以AuthenticationContext里能看到),但未被持久化到Azure AD B2C的用户存储中,导致Graph API无法查询到该属性值。以下是具体的排查和修复步骤:
1. 添加持久化声明配置
在负责写入用户数据的TechnicalProfile中(比如登录流程里的AAD-UserWriteProfile、注册流程里的AAD-UserWriteUsingEmailAddress等),添加PersistedClaims节点,指定要保存的自定义属性,确保B2C将生成的时间值写入用户目录:
<PersistedClaims> <!-- 保留其他已有的持久化声明 --> <PersistedClaim ClaimTypeReferenceId="extension_LastLogin" /> </PersistedClaims>
注意:要确保这个TechnicalProfile在执行
GetLastLoginDateTime转换之后被调用,这样生成的最新时间才会被保存。
2. 确认Graph API查询的属性名称格式
Azure AD B2C的自定义属性在Graph API中的名称格式为:extension_<扩展应用ID(去掉横杠)>_属性名。比如你的B2C扩展应用ID是12345678-1234-1234-1234-1234567890ab,那么对应的属性名是extension_123456781234123412341234567890ab_LastLogin。
在.NET SDK调用时,需要通过$select指定该属性才能返回:
// 替换为实际的用户ID和去横杠后的扩展应用ID var userId = "目标用户的Object ID"; var extensionAppIdWithoutDashes = "123456781234123412341234567890ab"; var lastLoginPropertyName = $"extension_{extensionAppIdWithoutDashes}_LastLogin"; var user = await graphClient.Users[userId] .Request() .Select($"id,{lastLoginPropertyName}") .GetAsync(); // 从AdditionalData中获取自定义属性值 var lastLoginValue = user.AdditionalData[lastLoginPropertyName];
3. 验证权限配置(可选)
如果其他自定义属性能正常通过Graph API获取,这一步大概率没问题,但可以快速确认:
- .NET SDK使用的应用注册已被授予
User.Read(读取当前用户)或User.Read.All(读取所有用户)权限 - 权限已完成管理员授予(如果是应用权限类型)
内容的提问来源于stack exchange,提问作者Andrew Mooweek
相关产品推荐
相关产品推荐

