2017-03-18 6 views
0

Ich versuche, einen Benutzer Zeichen in mit lokalem Konto zu haben und dann bis mit einem sozialen Konto anmelden, so dass ich die beide zusammen in meiner eigenen Datenbank verknüpfen. Auf diese Weise konnten sie später B2C verwenden und sich entweder bei lokalen oder sozialen Anbietern anmelden und am selben Konto in meinem System landen.OWIN, Core- und B2C - Mehrere Identitäten

Der Trick scheint sicher Informationen vom angemeldeten lokalen Benutzer (wie meine Datenbank-ID für diesen Benutzer) zu dem Anmeldeprozess für den sozialen Anbieter zu kommunizieren, so dass es in den Ansprüchen für den neuen Benutzer zurückkommen kann.

Ich dachte darüber nach, es zu der RedirectUrl der AuthenticationOptions hinzufügen, aber ich kann nicht herausfinden, wie unsicher das sein könnte. Wenn dieser Endpunkt durch ein [Authorize] -Attribut geschützt wäre, müsste ein Benutzer authentifiziert werden, bevor er aufgerufen wird.

Es scheint, als wäre es nicht sicher, die Datenbank-ID des lokalen Benutzers in die Weiterleitung hinzuzufügen. Selbst wenn der Benutzer authentifiziert würde, würden ein gestohlenes Token und ein modifizierter Abfrage-String die falschen Accounts mögen.

Gibt es eine Möglichkeit, Daten durch den B2C-Prozess zu übertragen?

{EDIT} Vergessen Sie zu erwähnen, dass dies eine Web-App ist. Native Client Ich verstehe, wie Sie das Token speichern.

Antwort

1

OK, falls diese dies jemand anderes versucht, helfen zu tun ...

Sie müssen die Controller-Aktion mit einem [Authorize] Attribute sichern. Auf diese Weise werden die eingehenden Ansprüche nach der Authentifizierung mit der B2C-Registrierungsrichtlinie für den externen Identitätsanbieter (z. B. Facebook) vorhanden sein.

In OpenIdconnectionOptions für diese Richtlinie, einen Event-Handler angeben,

Events = new OpenIdConnectEvents 
    { 
    ... 
    OnTicketReceived = TicketReceived, 
    ... 
    } 

Und dann in der Methode:

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")); 
} 

Die incomingClaims die Informationen vom Benutzer enthalten, die angemeldet wurde, als sie beschlossen, um den neuen Provider hinzuzufügen, und die neuen Claims sind diejenigen von der Anmeldung, die sie gerade abgeschlossen haben.

Jetzt können Sie tun, was magisch Sie die beiden in Ihrem eigenen db verbinden möchten.

HTH

+0

Ich hatte einige Schwierigkeiten mit dem System angenommen, dass Sie bereits eingeloggt waren, bevor Sie auf den sozialen Anbieter umleiten. Ich habe die Richtlinie für diese soziale Anmeldung geändert, um die Single Sign-On-Konfiguration zu deaktivieren, und sie schien dies zu beheben. – nhwilly

+0

Ok, nein. Das funktioniert nicht. Sie müssen einen neuen Principal erstellen, um die Ansprüche tatsächlich zu aktualisieren. – nhwilly