Asp.net core OWIN、Core和B2C-多重身份

Asp.net core OWIN、Core和B2C-多重身份,asp.net-core,owin,azure-ad-b2c,owin-middleware,Asp.net Core,Owin,Azure Ad B2c,Owin Middleware,我正在尝试让一个用户使用本地帐户登录,然后使用社交帐户注册,这样我就可以在自己的数据库中将这两个帐户链接在一起。这样,以后他们就可以使用B2C,通过本地或社会提供商登录,最终在我的系统中拥有相同的帐户 技巧似乎是安全地将登录本地用户的信息(如该用户的我的数据库id)传递到社交提供商的注册过程,以便它可以在新用户的声明中返回 我曾考虑将其添加到AuthenticationOptions的重定向URL中,但我不知道这有多不安全。如果该端点受到[Authorize]属性的保护,那么在调用它之前必须对用

我正在尝试让一个用户使用本地帐户登录,然后使用社交帐户注册,这样我就可以在自己的数据库中将这两个帐户链接在一起。这样,以后他们就可以使用B2C,通过本地或社会提供商登录,最终在我的系统中拥有相同的帐户

技巧似乎是安全地将登录本地用户的信息(如该用户的我的数据库id)传递到社交提供商的注册过程,以便它可以在新用户的声明中返回

我曾考虑将其添加到AuthenticationOptions的重定向URL中,但我不知道这有多不安全。如果该端点受到[Authorize]属性的保护,那么在调用它之前必须对用户进行身份验证

将本地用户的数据库id添加到重定向中似乎不安全。即使用户将通过身份验证,被盗的令牌和修改的查询字符串也会要求使用错误的帐户

是否有办法通过B2C流程实现数据往返


{EDIT}忘了提到这是一个web应用程序。本机客户端我了解如何保存令牌。

好的,如果这有助于其他尝试保存令牌的人

您需要使用[Authorize]属性保护控制器操作。这样,在使用外部身份提供商(如Facebook)的B2C注册策略进行验证后,将出现传入的索赔

在该策略的OpenIdconnectionOptions中,指定事件处理程序

Events = new OpenIdConnectEvents
    {
    ...
    OnTicketReceived = TicketReceived,
    ...
    }
然后在方法中:

private Task TicketReceived(TicketReceivedContext context)
 {
     var incomingClaims = context
         .HttpContext
         .User
         .Identities
         .First()
         .Claims;

     var newClaims = context
         .Principal
         .Identities
         .First()
         .Claims;

     context
        .Principal
        .Identities
        .First()
        .AddClaim(new System.Security.Claims.Claim("myClaim", "myClaimValue"));
 }
incomingClaims包含用户在决定添加新提供商时登录的信息,而newClaims是他们刚刚完成的注册中的信息

现在,您可以在自己的数据库中执行任何希望连接这两个数据库的魔法


HTH

我在系统中遇到了一些问题,假设您在重定向到社交提供商之前已经登录。我将社交注册的策略更改为禁用单点登录配置,这似乎解决了问题。好的,不,这不起作用。您必须创建一个新主体来实际更新索赔。