2015-05-14 6 views
8

Uso di IdentityServer3 È necessario effettuare automaticamente il login e reindirizzare un utente locale all'applicazione client dopo che l'utente ha completato un processo di registrazione. C'è un modo elegante per farlo? Dal mio scavo sospetto di no, nel qual caso c'è un trucco che posso usare per ottenere questo?Accesso automatico utente locale dopo la registrazione con IdentityServer3

Sono stato in grado di ottenere questo risultato per utenti esterni utilizzando un numero personalizzato User Service, ma questo ha utilizzato un accesso parziale. Tuttavia, per gli utenti locali non sono nel processo di autenticazione gestito dal servizio utente fino a quando non accedono con un nome utente e una password.

Si prega di notare inoltre che non ho accesso alla password degli utenti in quanto il processo di registrazione è coperto da più schermate/viste poiché in questo caso sono richieste per verificare la propria posta elettronica come parte del processo di registrazione.

Progress:

ho trovato questo https://github.com/IdentityServer/IdentityServer3/issues/563 ma non ho trovato il modo per attivare il redirect.

Sto tentando di emettere un token di autenticazione utilizzando:

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

Ma il meglio che posso fare finora è reindirizzare l'utente alla schermata di login:

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

risposta

14

Aggiungere la registrazione collegamento alla pagina di accesso tramite LoginPageLinks:

var authOptions = new Thinktecture.IdentityServer.Core.Configuration.AuthenticationOptions 
{ 
    IdentityProviders = ConfigureIdentityProviders, 
    EnableLocalLogin = true, 
    EnablePostSignOutAutoRedirect = true, 
    LoginPageLinks = new LoginPageLink[] { 
     new LoginPageLink{ 
      Text = "Register", 
      Href = "Register" 
     } 
    } 
}; 

L'utilizzo di LoginPageLink determinerà un parametro url di accesso verrà aggiunto alla fine dell'URL nella pagina di accesso. Questo deve essere preservato se il processo di registrazione si estende su più pagine. Facile da memorizzare questo valore in un cookie.

Un getcha è che la pagina di registrazione deve esistere con lo stesso URL di Identity Server, ad es. "nucleo". Ciò consentirà alle tue pagine di condividere cookie con Identity Server. Nel controller standard MVC questo può essere realizzato utilizzando il decoratore Strada:

[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()); 
} 

Una volta che il processo di registrazione è stato completato è possibile utilizzare il metodo di estensione IssueLoginCookie per creare un cookie di login. Il parametro signin URL può quindi essere utilizzato con il metodo di estensione GetSignInMessage a retrive un ReturnUrl per reindirizzare la risposta che accedere automaticamente l'utente e restituirli all'applicazione client:

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

Grazie Gavin! Quindi è l'unico modo in cui possiamo presentare ai nostri utenti un link di registrazione attraverso il nostro sito tramite la pagina di accesso? – Tim

+0

@Tim - Sono sicuro che ci sono anche altri modi, non sperimentato me stesso. – Gavin

+0

@Gavin hai trovato un altro modo per favore condividere – Moes

Problemi correlati