Pagina di accesso su domini diversi

Sono completamente nuovo all’autenticazione OWIN e devo essere frainteso dal modo in cui tutto funziona, ma non riesco a trovarlo menzionato da nessuna parte.

Tutto quello che voglio è poter utilizzare un dominio centrale per l’autenticazione. Se qualcuno tenta di accedere ad apps.domain.com quando non è autenticato, verrà reindirizzato su accounts.domain.com/login modo che tutta l’autenticazione sia separata nel proprio dominio e applicazione. Questo è stato molto facile con l’autenticazione di moduli MVC 4 in cui è ansible specificare un URL completo, ma non sembra essere con OWIN.

In Startup.Auth.cs :

 app.UseCookieAuthentication(new CookieAuthenticationOptions { LoginPath = new PathString("/account/login") } 

È facile specificare il dominio quando si imposta il cookie con l’opzione CookieDomain . Tuttavia, quando si specifica il percorso di accesso per il reindirizzamento a, deve essere relativo all’applicazione corrente, quindi come faccio a realizzare ciò che è stato così facile nell’autenticazione dei moduli MVC 4?

Senza entrare troppo in profondità su cosa sia l’autenticazione OWIN, non sono riuscito a trovare nulla che risolvesse questo problema dopo un paio d’ore di ricerche.

 public class Startup { public void Configuration(IAppBuilder app) { app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationMode = AuthenticationMode.Active, LoginPath = new PathString("/account/login"), LogoutPath = new PathString("/account/logout"), Provider = new CookieAuthenticationProvider { OnApplyRedirect = ApplyRedirect }, }); } private static void ApplyRedirect(CookieApplyRedirectContext context) { Uri absoluteUri; if (Uri.TryCreate(context.RedirectUri, UriKind.Absolute, out absoluteUri)) { var path = PathString.FromUriComponent(absoluteUri); if (path == context.OwinContext.Request.PathBase + context.Options.LoginPath) { context.RedirectUri = "http://accounts.domain.com/login" + new QueryString( context.Options.ReturnUrlParameter, context.Request.Uri.AbsoluteUri); } } context.Response.Redirect(context.RedirectUri); } } 

Se apps.dominio.com è l’unica base di URL di ritorno ansible, è consigliabile prendere in considerazione la possibilità di sostituire context.Request.Uri.AbsoluteUri con context.Request.PathBase + context.Request.Path + context.Request.QueryString e creare un URL di ritorno assoluto nel tuo server di autenticazione per proteggere le tue app da reindirizzamenti abusivi.

Spero che questo ti aiuti 😉

EDIT : potresti chiederti perché non applichi direttamente il reindirizzamento usando la proprietà context.RedirectUri . Infatti, ICookieAuthenticationProvider.ApplyRedirect è responsabile di reindirizzamenti multipli, corrispondenti ai flussi di log-in e di disconnessione (sì, lo so, infrange il principio di responsabilità singola …). Ma c’è anche peggio: context.RedirectUri può rappresentare l’URL assoluto dell’endpoint di autenticazione all’inizio del stream di log-in o della destinazione finale del browser (cioè il vero e proprio “URL di ritorno”) quando il cookie viene effettivamente rimandato a il browser … ecco perché dobbiamo assicurarci che context.RedirectUri sia assoluto e corrisponda al context.Options.LoginPath registrato.Options.LoginPath.

Sto lavorando attraverso gli esempi per https://github.com/IdentityServer/IdentityServer3 e ho una risposta diversa. Nell’esempio https://www.scottbrady91.com/Identity-Server/Identity-Server-3-Standalone-Implementation-Part-2 mostrano un’app MVC che utilizza un’autenticazione standalone IdP e cookie. L’esempio non ha incluso il reindirizzamento dei 401, ma sono incappato in un modo.

Lo schema di base consiste nel creare un’azione nel AccountController per l’accesso.

 public ActionResult SignIn() { // set up some bookkeeping and construct the URL to the central auth service return Redirect(authURL); } 

Ora hai un URL locale che può essere utilizzato nell’avvio

 public class Startup { public void Configuration(IAppBuilder app) { app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = "Cookies", LoginPath = new PathString("/Account/SignIn") }); } 

Hai anche il vantaggio che puoi aggiungere un link di azione a SignIn sulla barra dei menu, per le persone che vogliono accedere prima che ci sia un 401. Quello che abbiamo fatto qui è disaccoppiare la decisione di cosa fare quando un l’utente non autenticato richiede una risorsa da come si ottiene l’autenticazione.