2017-03-18 45 views
0

我想有一个用户登录与本地帐户,然后登录与社交帐户,这样我可以在我自己的数据库两者联系在一起。这样,以后他们可以使用B2C并通过本地或社交提供商登录,并在系统中使用相同的帐户。OWIN,核心和B2C - 多重身份

这个技巧似乎是安全地将签署的本地用户的信息(如我的用户的数据库ID)传递给社交提供商的注册过程,以便它可以回到新用户的声明中。

我想过把它添加到AuthenticationOptions的RedirectUrl中,但我无法弄清楚这可能是多么不安全。如果该端点受到[Authorize]属性的保护,则在调用用户之前,必须对其进行身份验证。

似乎将本地用户的数据库ID添加到重定向中并不安全。即使用户将被认证,被盗的令牌和修改后的查询字符串也会喜欢错误的帐户。

有没有办法让数据往返通过B2C流程?

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

回答

1

确定,在此情况下帮助其他人试图做到这一点...

您需要与[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

+0

我对系统有一些困难,假设您在重定向到社交提供者之前已经登录过。我改变了该社交注册的政策,禁用了单一登录配置,并且似乎解决了这一问题。 – nhwilly

+0

好的,没有。这是行不通的。您必须创建一个新的委托人才能真正更新索赔。 – nhwilly