2015-05-14 11 views
8

Mit IdentityServer3 Ich muss einen lokalen Benutzer automatisch anmelden und umleiten, zurück zu der Client-Anwendung, nachdem der Benutzer einen Registrierungsprozess abgeschlossen hat. Gibt es eine elegante Möglichkeit, dies zu tun? Von meinem Graben vermute ich nicht, in welchem ​​Fall gibt es einen Hack, den ich verwenden kann, um dies zu erreichen?Automatischer Login lokaler Benutzer nach der Registrierung mit IdentityServer3

Ich konnte dies für externe Benutzer mit einem benutzerdefinierten User Service erreichen, aber dies nutzte eine teilweise Anmeldung. Bei lokalen Benutzern wird der Authentifizierungsprozess jedoch erst vom Benutzerdienst ausgeführt, wenn er sich mit einem Benutzernamen und einem Kennwort anmeldet.

Bitte beachten Sie auch, dass ich nicht auf das Benutzerpasswort zugreifen kann, da der Registrierungsprozess durch mehrere Bildschirme/Ansichten abgedeckt wird, da sie in diesem Fall ihre E-Mail als Teil des Registrierungsprozesses verifizieren müssen.

Fortschritt:

ich diese https://github.com/IdentityServer/IdentityServer3/issues/563 gefunden habe, aber noch nicht ausgearbeitet, wie die Umleitung auszulösen.

Ich bin versucht, ein Authentifizierungstoken zur Ausgabe mit:

var localAuthResult = userService.AuthenticateLocalAsync(user); 
Request.GetOwinContext().Authentication.SignIn(new ClaimsIdentity(localAuthResult.Result.User.Claims, Thinktecture.IdentityServer.Core.Constants.PrimaryAuthenticationType)); 

Aber das Beste, was ich bisher tun kann, ist den Benutzer zurück zum Login-Bildschirm umleiten:

HttpCookie cookie = Request.Cookies["signin"]; // Stored previously at beginning of registration process 
return Redirect("~/core/login?signin=" + cookie.Value); 

Antwort

14

die Registrierung hinzufügen Link zur Login-Seite mit LoginPageLinks:

Die Verwendung von LoginPageLinks führt zu Ein Anmelde-URL-Parameter wird am Ende Ihrer URL auf der Anmeldeseite hinzugefügt. Dies muss beibehalten werden, wenn der Registrierungsprozess mehrere Seiten umfasst. Einfach, diesen Wert in einem Cookie zu speichern.

Ein Problem ist, dass die Registrierungsseite unter der gleichen URL wie Identity Server, z. "Ader". Dadurch können Ihre Seiten Cookies mit Identity Server teilen. In Standard-MVC-Controller kann dieser Dekorateur mit der Strecke erreicht werden:

[Route("core/Register")] 
[HttpGet] 
[AllowAnonymous] 
public ActionResult Register(string signin) 
{ 
    Response.Cookies.Add(new HttpCookie("signin", signin)); // Preserve the signin so we can use it to automatically redirect user after registration process 
    return View(new RegisterViewModel()); 
} 

Sobald die Registrierung abgeschlossen ist Sie die IssueLoginCookie Extension-Methode verwenden, um einen Login-Cookie zu erstellen. Der signin URL-Parameter kann dann mit der GetSignInMessage Erweiterungsmethode verwendet werden, um ein ReturnUrl retrive die Reaktion auf der Umleitung auf die die Benutzer automatisch auf und schickt sich an die Client-Anwendung anmelden:

using Thinktecture.IdentityServer.Core.Extensions; 
using Thinktecture.IdentityServer.Core.Models; 

... 

AuthenticatedLogin login = new AuthenticatedLogin() 
    { 
     IdentityProvider = Thinktecture.IdentityServer.Core.Constants.BuiltInIdentityProvider, 
     Subject = userId, 
     Name = AuthObjects.AuthUserService.GetDisplayNameForAccount(userId) 
    }; 
Request.GetOwinContext().Environment.IssueLoginCookie(login); 

HttpCookie cookie = Request.Cookies["signin"]; 
if (cookie != null) 
{ 
    SignInMessage message = Request.GetOwinContext().Environment.GetSignInMessage(cookie.Value); 
    return Redirect(message.ReturnUrl); 
} 
else 

... 
+0

Dank Gavin! Nur so können wir unseren Nutzern über die Anmeldeseite einen Registrierungslink über unsere Website anbieten. – Tim

+0

@Tim - Ich bin sicher, dass es auch andere Wege gibt, experimentierte mich aber nicht. – Gavin

+0

@Gavin haben Sie sonst bitte teilen – Moes

Verwandte Themen