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

Posted

技术标签:

【中文标题】如何使用 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 【发布时间】:2021-12-02 08:46:25 【问题描述】:

我有一个用户流 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 请求,发送自定义属性。

我的 web 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”声明,其中包含我数据库中的一些值。 使其包含在后续发行的令牌中。上面的代码对此是否正确?

【问题讨论】:

我认为它不起作用。这是预览版,我也遇到了同样的情况。 B2C 中的审核日志显示继续并标记为成功,但声明未添加到令牌中。 【参考方案1】:

您的代码很好。只需在 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 似乎可以正常工作。

【讨论】:

【参考方案2】:

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

"JsonElement 的主体不包含自定义属性。里面我 见 body.ValueKind = Undefined"

出了什么问题。 为了支持 HTTP Patch 请求,我在 Startup 中添加了 NewtonsoftJson 包和配置:

services.AddControllers().AddNewtonsoftJson(x => 

   x.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
);

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

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

【讨论】:

以上是关于如何使用 api 连接器和 asp net core web api 通过自定义声明丰富 azure b2c 令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何在 asp.net web apis 中启用 cors 选项。?

如何在 asp.net 自托管 API 中启用 CORS?

如何让 CORS 与 ASP.Net Core Web API 服务器 Angular 2 客户端一起工作

如何在 WEB API 的 ASP.NET MVC 控制器级别中启用 CORS? [复制]

如何防止简单的 CORS GET 请求访问我的 ASP.Net Core API 服务器上的操作方法? [复制]

CORS:使用 ASP.NET 4.5.1 MVC 的 Rest API