如何使用 api 连接器和 asp net core web api 通过自定义声明丰富 azure b2c 令牌

How to enrich azure b2c token with custom claims using api connectors and asp net core web api

我有用户流B2C_1_singupsingin1 我添加了一个 api 连接器,将其嵌入此流和 API 调用的端点 url。 用过的文章: https://docs.microsoft.com/en-us/azure/active-directory-b2c/add-api-connector-token-enrichment?pivots=b2c-user-flow

从文章中可以清楚地看出,API 连接器具体化为 HTTP POST 请求,发送自定义属性。

我的网站 api 有一个端点代码:

[HttpPost("enrich")]
public IActionResult Enrich([FromBody] JsonElement body)
{
    var responseProperties = new Dictionary<string, object> //for example
    {
        { "version", "1.0.0" },
        { "action", "Continue" },
        { "postalCode", "12349" },
        { "userId", 123 } 
    };

    return new JsonResult(responseProperties) { StatusCode = 200 };
}

当我启动自定义流程时,一切正常,我在 api 中到达了那个端点。 但是有一个问题 JsonElement body 不包含自定义属性。在里面我看到 body.ValueKind = Undefined。 告诉我我做错了什么?

另外,毕竟,我想添加一个自定义的“userId”声明,其中包含我数据库中的一些值。 从而包含在后续发行的token中。上面的代码对此是否正确?

你的代码没问题。只需在 postalCode 和 userId 前添加“extension_”即可。

    [HttpPost("log")]
    public IActionResult Log([FromBody] JsonElement body)
    {

        var responseProperties = new Dictionary<string, object> 
        {
            { "version", "1.0.0" },
            { "action", "Continue" },
            { "extension_Role", "admin" },
        };

        return new JsonResult(responseProperties) { StatusCode = 200 };
    }

在我的 Azure AD B2C 中,我有一个名为“角色”的自定义属性。

但在调试模式下,我看到所有自定义属性 extension_ 都设置为前缀...

因此,将其添加到 responseProperties 似乎有效。

我很久以前就解决了这个问题,但也许我的经验会对某些人有所帮助。 第一部分问题:

"The body of the JsonElement contains no custom attributes. Inside I see body.ValueKind = Undefined"

问题出在哪里。 为了支持 HTTP 补丁请求,我将 NewtonsoftJson 包和配置添加到 Startup:

services.AddControllers().AddNewtonsoftJson(x => 
{
   x.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});

但我没有考虑到 AddNewtonsoftJson 取代了用于格式化所有 JSON 内容的基于 System.Text.Json 的输入和输出格式化程序。因此,我遇到了上述问题。 Solution from Microsoft documentation

问题第二部分的自定义声明的解决方案由 Steffen 提供。您只需添加 extension_ 前缀即可领取。