2015-10-16 10 views
5

Mamy środowiska z następujących czynności:Jak skonfigurować uwierzytelnianie oparte ciasteczka z NancyFx i IdentityServer3 (strony non-API)

  • instancja Samodzielny IdentityServer3 (kwestie odniesienie tokenów nie JWT)
  • ASP.NET WebAPI zasobów serwera
  • aplikacje klienckie .NET że uwierzytelnić IdSvr (poprzez przepływ właściciela zasobu)

... a teraz chcielibyśmy rozpocząć dodawanie hostowanej przez OWIN aplikacji internetowej, która będzie używać NancyFx do serwowania stron renderowanych przez serwer, a także kilku AngularJS SPA. Ta strona Nancy NIE będzie hostować żadnych interfejsów API, ale może pobierać dane z naszego istniejącego interfejsu API. Chciałbym dodać uwierzytelnienie w potoku OWIN, aby zabezpieczyć nasze aplikacje Angular przed wysłaniem do użytkowników, którzy nie mają dostępu.

Byłoby to w przeciwieństwie do wysyłania kodu SPA, a po ustawieniu kątowym, jeśli użytkownik powinien zobaczyć cokolwiek. W tym przypadku już zdemaskowaliśmy bazę kodu javascript, a tego chcemy uniknąć.

Próbuję zrozumieć, w jaki sposób powinienem skonfigurować tę witrynę Nancy do uwierzytelniania użytkowników na serwerze IdentityServer przy użyciu niejawnego przepływu. Wcześniej wdrożyłem ten schemat uwierzytelniania w autonomicznych obiektach SPA (gdzie wszystkie uwierzytelnienia były obsługiwane przez kod AngularJS, a tokeny były przechowywane w lokalnej pamięci HTML5), ale jestem trochę zagubiony, jeśli chodzi o właściwe rozwiązanie tego problemu w ramach potoku OWIN.

Wydaje mi się, że odpowiedź typu OWIN cookie typu "middleware" jest odpowiedzią, ale czy to oznacza:

  • Potrzebuję przekierować użytkownika do serwera tożsamości (przy użyciu właściwych argumentów URL dla niejawnego przepływu)?
  • IdentityServer przekieruje użytkownika z powrotem do mojej witryny po udanym logowaniu, więc czy w tym miejscu przechodzę do menedżera autoryzacji OWIN, aby ustawić odpowiedni plik cookie?

... Czy też myślę o tym źle?

Dla porównania przeczytałem następujące posty i są one bardzo pomocne, ale nie widzę dużego obrazu z OWINEM Mam zamiar poeksperymentować z dodatkowym oprogramowaniem UseOpenIdConnectAuthentication, ale byłbym wdzięczny za wszelkie wskazówki, jakie mogą tu mieć SO.

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

Odpowiedz

4

Zasadniczo realizacji uwierzytelniania OpenID Connect w aplikacji Nancy hostowane przez OWIN jest naprawdę nie różni się od jej wykonania w dowolnej aplikacji MVC/Katana (zespół Thinktecture ma próbkę do tego scenariusz: https://github.com/IdentityServer/IdentityServer3.Samples/tree/master/source/Clients/MVC%20OWIN%20Client)

zasadniczo potrzebujemy 3 rzeczy: middleware cookie middleware OpenID Podłącz i middleware Nancy:

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

Jeśli szukasz funkcjonalnego demo, możesz spojrzeć na https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/tree/dev/samples/Nancy/Nancy.Client (uwaga: nie korzysta z IdentityServer3 dla części serwera OIDC, ale nie powinno to robić żadnej różnicy dla aplikacji klienckiej).

+0

Jest to bardzo pomocne. Zacząłem rozumieć, jak to wszystko działa od momentu zamieszczenia mojego pytania, ale twój link do tego przykładu AspNet.Security pomógł wypełnić ostatnie luki (szczególnie wokół wywołania przekierowania do OIDC dla logowania/wylogowania). Jedyną rzeczą, którą chciałbym zasugerować dodając do twojego przykładu, jest to, w jaki sposób wykorzystać Callbacks OpenIdConnectAuthenticationNotifications. O ile prawdą jest, że serwer OIDC nie ma większego znaczenia, musiałem odtworzyć AuthenticationTicket w ramach wywołania zwrotnego SecurityTokenValidated, aby spełnić moje specyficzne potrzeby. –

+0

Dzięki za sugestię. Usunąłem powiadomienia, aby odpowiedź była jak najprostsza. Możesz tam znaleźć cały przykładowy kod (z powiadomieniami implementującymi obsługę przepływu hybrydowego i automatycznego przechowywania tokenu): https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/blob/dev/samples/Nancy/Nancy .Client/Startup.cs – Pinpoint

Powiązane problemy