2015-10-16 2 views
5

Wir haben eine Umgebung mit folgenden einzurichten:Wie Cookie basierte Authentifizierung mit NancyFx und IdentityServer3 (Nicht-API-Website)

  • Standalone IdentityServer3 Instanz (Ausgaben Referenz Tokens, nicht jwt)
  • ASP.NET WebAPI Ressource-Server
  • .NET-Client-Anwendungen, die gegen IdSvr authentifizieren (über Strömungsressourceneigentümer)

... und jetzt Wir möchten nun eine von OWIN gehostete Web-App hinzufügen, die NancyFx für Server-gerenderte Seiten sowie einige AngularJS-SPAs verwendet. Diese Nancy-Website hostet KEINE APIs, kann jedoch Daten von unserer bestehenden API verwenden. Ich möchte die Authentifizierung in der OWIN-Pipeline hinzufügen, um sicherzustellen, dass unsere Angular-Anwendungen nicht an Benutzer gesendet werden, die keinen Zugriff haben.

Dies wäre im Gegensatz zum Senden der SPA-Code, und mit Angular bestimmen, ob der Benutzer nichts sehen sollte. In diesem Fall haben wir die JavaScript-Codebasis bereits offengelegt, und das wollen wir vermeiden.

Ich versuche zu verstehen, wie ich diese Nancy-Site zur Authentifizierung von Benutzern gegen IdentityServer mit dem impliziten Fluss konfigurieren sollte. Ich habe dieses Authentifizierungsschema zuvor in Standalone-SPAs implementiert (wo die gesamte Authentifizierung mit AngularJS-Code erfolgte und Tokens im lokalen HTML5-Speicher gespeichert wurden), aber ich bin ein bisschen verloren, wie ich dies in der OWIN-Pipeline richtig angehen kann.

Ich denke, dass die OWIN-Cookie-Authentifizierung Middleware die Antwort ist, aber bedeutet das Folgendes?

  • Ich muss den Benutzer zu IdentityServer umleiten (mit den richtigen URL-Argumente für den impliziten Fluss)?
  • IdentityServer leitet den Benutzer bei einer erfolgreichen Anmeldung an meine Site zurück, also wo hake ich mich in den OWIN Authorization Manager ein, um den passenden Cookie zu setzen?

... oder denke ich darüber alles falsch?

Als Referenz habe ich die folgenden Beiträge gelesen, und sie sind sehr hilfreich, aber ich sehe nicht das große Bild mit OWIN. Ich werde als nächstes mit der Middleware UseOpenIdConnectAuthentication experimentieren, aber ich würde mich über jede Anleitung freuen, die SO hier haben könnte.

http://brockallen.com/2013/10/24/a-primer-on-owin-cookie-authentication-middleware-for-the-asp-net-developer/

https://github.com/IdentityServer/IdentityServer3/issues/487

Antwort

4

Grundsätzlich Authentifizierung OpenID Connect Implementierung in einer Nancy App über OWIN gehostet ist wirklich nicht anders als es in jedem MVC/Katana App Implementierung (die Thinktecture Team hat eine Probe für diese Szenario: https://github.com/IdentityServer/IdentityServer3.Samples/tree/master/source/Clients/MVC%20OWIN%20Client)

Sie müssen im Grunde 3 Dinge: die Cookie-Middleware, Middleware der OpenID Connect und die Nancy-Middleware:

public class Startup { 
    public void Configuration(IAppBuilder app) { 
     app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 

     app.UseCookieAuthentication(new CookieAuthenticationOptions { 
      AuthenticationMode = AuthenticationMode.Active, 
      AuthenticationType = CookieAuthenticationDefaults.AuthenticationType 
     }); 

     app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions { 
      AuthenticationMode = AuthenticationMode.Active, 

      // Set the address of your OpenID Connect server: 
      Authority = "http://localhost:54541/" 

      // Set your client identifier here: 
      ClientId = "myClient", 

      // Set the redirect_uri and post_logout_redirect_uri 
      // corresponding to your application: 
      RedirectUri = "http://localhost:56765/oidc", 
      PostLogoutRedirectUri = "http://localhost:56765/" 
     }); 

     app.UseNancy(options => options.PerformPassThrough = context => context.Response.StatusCode == HttpStatusCode.NotFound); 
    } 
} 

Wenn Sie nach einer funktionalen Demo suchen, können Sie sich https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/tree/dev/samples/Nancy/Nancy.Client ansehen (Hinweis: Es wird kein IdentityServer3 für den OIDC-Server-Teil verwendet, aber es sollte für die Client-App keinen Unterschied machen).

+0

Dies ist sehr hilfreich. Ich habe angefangen zu verstehen, wie das alles funktioniert, seit ich meine Frage gepostet habe, aber Ihre Verbindung zu diesem AspNet.Security-Beispiel half dabei, die letzten Lücken zu füllen (insbesondere um eine Weiterleitung an die OIDC auszulösen für die An-/Abmeldung). Die einzige andere Sache, die ich vorschlagen würde, Ihrem Beispiel hinzuzufügen, ist, wie man die Callbacks von OpenIdConnectAuthenticationNotifications nutzt. Obwohl es wahr ist, dass der OIDC-Server keine Rolle spielt, musste ich das AuthenticationTicket innerhalb des SecurityTokenValidated-Callbacks neu erstellen, um meine spezifischen Bedürfnisse zu erfüllen. –

+0

Danke für den Vorschlag. Ich habe die Benachrichtigungen entfernt, um die Antwort so einfach wie möglich zu halten. Sie können das gesamte Codebeispiel dort finden (mit Benachrichtigungen, die Hybrid-Flow-Unterstützung und automatischen Token-Speicher implementieren): https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/blob/dev/samples/Nancy/Nancy .Client/Startup.cs – Pinpoint

Verwandte Themen