如何通过API连接器与ASP.NET Core Web API为Azure B2C令牌添加自定义声明
问题1:JsonElement body为空,ValueKind为Undefined的排查方案
- 首先检查用户流的API连接器声明配置:进入你的B2C_1_singupsingin1用户流配置页,找到「API连接器」板块,点开你绑定的连接器配置,在要发送到API的声明区域,勾选所有你需要接收的内置属性、自定义属性,未勾选的属性不会被B2C发送到你的接口,是最常见的空body原因。
- 检查接口的内容类型绑定:给你的Enrich接口添加
[Consumes("application/json")]特性,确保ASP.NET Core正确识别B2C发送的JSON格式请求,完成模型绑定,避免绑定失败导致body为默认的Undefined值。 - 排查请求体原始内容:可以在接口中添加原始请求体读取逻辑,确认B2C是否真的没有发送内容,示例代码如下:
[HttpPost("enrich")] [Consumes("application/json")] public IActionResult Enrich([FromBody] JsonElement body) { if (body.ValueKind == JsonValueKind.Undefined) { Request.Body.Position = 0; using var reader = new StreamReader(Request.Body); var rawRequestBody = reader.ReadToEnd(); // 此处可输出rawRequestBody日志,确认请求实际携带内容 } var responseProperties = new Dictionary<string, object> { { "version", "1.0.0" }, { "action", "Continue" }, { "postalCode", "12349" }, { "userId", 123 } }; return new JsonResult(responseProperties) { StatusCode = 200 }; }
问题2:将自有数据库的userId添加到令牌的实现说明
你现有代码的基础逻辑是可行的,只要补充以下配置即可完成需求:
- 首先在Azure B2C租户的「用户属性」页面,创建和你返回字段名一致的自定义属性
userId,属性类型和你返回的值类型匹配(示例中为数字,可选整数类型)。 - 回到B2C_1_singupsingin1用户流配置页,进入应用声明板块,找到你刚创建的
userId属性并勾选,B2C只会将勾选的应用声明放入最终签发的令牌中。 - 保持返回的响应为200状态码,
action值为Continue即可,B2C会自动将你返回的合法属性纳入用户声明池,最终带到令牌里。
内容的提问来源于stack exchange,提问作者Александр Климук
相关产品推荐
相关产品推荐

