2015-02-26 10 views
6

Próbuję utworzyć prostą aplikację sprawdzającą koncepcję OAuth, ale utknąłem w implementacji kodu autoryzacji. Gdziekolwiek czytam, wygląda na to, że idzie w taki czy inny sposób, nigdy w rzeczywistości nie używając przepływu kodu autoryzacji. Używam następujące zasoby dla informacji:Jak zaimplementować przepływ Authorization_Code OAuth2 w Web Api przy użyciu oprogramowania pośredniego OWIN?

Mam konfiguracji Web API i owin z niestandardowym OAuthAuthorizationServerProvider przyjąć typy hasło grant na odświeżeniu tokeny i możliwość wymiany tokena odświeżania na token dostępu. Działa to dobrze, ale chcę skonfigurować scenariusz, w którym przekierowuję przeglądarkę na serwer, aby autoryzować i przekierowywać z powrotem do klienta za pomocą kodu autoryzacji. Następnie chcę, aby klient wysłał kod autoryzacji do punktu końcowego tokenu, aby uzyskać token odświeżania. W drugim łączu pod aplikacjami serwera sieci Web próbuję pobrać aplikację web api, aby wyprowadzić kod autoryzacji z żądania jak, http://127.0.0.1/auth?response_type=code&client_id=123&redirect_uri=http://validredirect.com&scope=access, ale ja wciąż dostaję 404.

mam skonfigurowane owin następująco:

var databaseContext = new AdnsfContext(); 

WebApp.Start(
    new StartOptions("http://127.0.0.1:7000"), 
    appBuilder => 
    { 
     var httpConfig = new HttpConfiguration(); 
     httpConfig.MapHttpAttributeRoutes(); 
     httpConfig.SuppressDefaultHostAuthentication(); 
     httpConfig.Filters.Add(new HostAuthenticationFilter("Bearer")); 

     appBuilder 
      .UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions 
       { 
        AllowInsecureHttp = true, 
        ApplicationCanDisplayErrors = true, 
        AuthorizeEndpointPath = new PathString("/auth"), 
        TokenEndpointPath = new PathString("/token"), 
        AuthorizationCodeExpireTimeSpan = TimeSpan.FromMinutes(1), 
        AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(1), 
        Provider = new AuthServerProvider(), 
        AuthorizationCodeProvider = new AuthorizationCodeProvider(), 
        RefreshTokenProvider = new RefreshTokenProvider(), 
       }) 
      .UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions 
       { 
        AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active, 
        AuthenticationType = "Bearer", 
       }) 
      .UseCors(CorsOptions.AllowAll) 
      .UseWebApi(httpConfig); 
    }); 

kawałki dodałem aby umożliwić końcowy autoryzacji są właściwości dla opcji serwera auth:

AuthorizeEndpointPath = new PathString("/auth"), 
AuthorizationCodeExpireTimeSpan = TimeSpan.FromMinutes(1), 
AuthorizationCodeProvider = new AuthorizationCodeProvider(), 

Zastąpienie w mojej implementacji rzutu AuthorizationCodeProvider nie zaimplementowano wyjątków, ale obecnie nie ma nawet trafienia żadnych punktów przerwania ustawionych w kodzie. Należy zwrócić uwagę na to, że kiedy używam listonosza do trafienia w autowy punkt końcowy, otrzymuję nagłówek serwera dla HTTPAPI/2.0, który jest inny niż wtedy, gdy po prostu nie jest coś wypalanego na tym punkcie końcowym, co oznacza, że ​​muszę wysłać żądanie nieprawidłowo. Czy ktoś może zobaczyć problem z moją konfiguracją? Z góry dziękuję, wiem, że jest to wyraźnie moja porażka w zrozumieniu OWIN i OAuth.

Odpowiedz

3

Spójrz na IdentityServer. Opiera się na Owin. Istnieje również samples repository, gdzie można znaleźć wiele przykładów za pomocą selfdeployed i \ lub dostawców zewnętrznych tożsamości.

Myślę, że przykład this one jest najbardziej odpowiedni dla Ciebie.

+0

IdentityServer był doskonałym zasobem. Wraz z oryginalnym oauth2 spce, IdentityServer i przykładowym serwerem autoryzacji, do którego pierwotnie się przyłączyłem, udało mi się to ustalić. –

+3

@JoshuaBelden Czy możesz podać swoje ostateczne rozwiązanie jako odpowiedź? A przynajmniej jego znaczące części? –

3

Jedną rzeczą, aby pamiętać z serwera autoryzacji OAuth2 zbudowany w Katana jest to, że przejrzysty: musisz podać swój własny/auth punktu końcowego (przy użyciu MVC lub Nancy na przykład) lub bezpośrednio renderować formularz zgody na OAuthAuthorizationServerProvider.AuthorizationEndpoint

Możesz zobaczyć https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/tree/dev/samples/Mvc dla kompletnej próbki. Nie korzysta z serwera autoryzacji OAuth2 wbudowanego w Katana, ale znacznie bardziej rozbudowanego widelca przeznaczonego do OpenID Connect, ale powinieneś go mieć.

Powiązane problemy