2015-01-25 9 views
8

Ich habe zwei Hauptprojekte in meiner Web-Anwendung:WebAPI owin verwendet Token und Cookie

  1. WebAPI Projekt als Back-End-Authentifizierung und Autorisierung für das Webprojekt zu dienen, indem OWIN 2 mit Inhaber Token.
  2. Web-Projekt verwendet Angularjs.

Das Webprojekt wie erwartet funktioniert (Authentifizierung und Autorisierung arbeiten)

Methode: Laden Token an local, und senden Sie es Abfangjäger mit jeder Anfrage.

Jetzt möchte ich dem WebApi-Projekt Authentifizierung und Autorisierung hinzufügen, die anderen Modulen wie Hangfire, Elmah und Hilfeseiten dienen würde. Ich habe die gleiche Login-Logik hinzugefügt, die funktioniert (Autorisierung) und dann zur Dashboard-Seite (mit Angularjs) umgeleitet wird, die funktioniert.

Aber kommen wir zu einer anderen Seite (einer der genannten Module) nicht funktioniert nicht tun work.By. Der Benutzer vom Owin Kontext immer null/leer (siehe Code)

Für mein Verständnis, ich muss irgendwie das Token bei jeder Anfrage senden, was hier nicht passiert.

Fragen:

  1. Wie kann ich das (Senden/getting das Token) erreichen?

    Wenn Cookie der einzige/besserer Ansatz ist ↴

  2. Wie kann ich Cookies für Projekt 1 und Token für Projekt integrieren 2? (Versucht, Cookies zu verwenden, aber es scheint, dass ich es falsch mache, oder tut sie arbeiten gleichzeitig mit Inhaber Token)

Code:?

public void Configuration(IAppBuilder app) 
{ 
    HttpConfiguration config = new HttpConfiguration(); 

    OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions() 
    { 

     AllowInsecureHttp = true, 
     TokenEndpointPath = new PathString("/token"), 
     AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30), 
     Provider = new SimpleAuthorizationServerProvider(), 
     RefreshTokenProvider = new SimpleRefreshTokenProvider() 
    }; 

    app.UseOAuthAuthorizationServer(OAuthServerOptions); 
    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()); 

    GlobalConfiguration.Configure(WebApiConfig.Register); 
    app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 
    app.UseWebApi(config); 

    AreaRegistration.RegisterAllAreas(); 

    app.UseHangfire(hangfireConfig => 
    { 
     config.UseAuthorizationFilters(
      new AuthorizationFilter { Users = "admin, superuser", Roles = "advanced" }, 
      new ClaimsBasedAuthorizationFilter("name", "value") 
     ); 

     hangfireConfig.UseSqlServerStorage("Context"); 
     hangfireConfig.UseServer(); 
    }); 
} 

ich zu Testzwecken versucht:

public class HFAuthorizationFilter : Hangfire.Dashboard.IAuthorizationFilter 
{ 
    public bool Authorize(IDictionary<string, object> owinEnvironment) 
    { 
     var context = new OwinContext(owinEnvironment); 

     if (context.Authentication.User == null) 
      return false;//Always null 

     return context.Authentication.User.HasClaim(ClaimTypes.Role, "SuperAdmin") 
      || context.Authentication.User.HasClaim(ClaimTypes.Role, "Admin"); 
    } 
} 

und in Konfiguration:

app.UseHangfire(hangfireConfig => 
{ 
    hangfireConfig.UseAuthorizationFilters(
     new HFAuthorizationFilter() 
    ); 

    hangfireConfig.UseSqlServerStorage("Context"); 
    hangfireConfig.UseServer(); 
}); 

Mögliche doppelte: Passing and verifying the OWIN Bearer token in Query String in WebAPI

Antwort

0

, wenn ich das richtig verstanden, Sie suchen Token Generation in einer api und verwenden das gleiche Token in anderen api zu implementieren. Wenn dies der Fall ist, müssen Sie Master-API als Token-Generator und Kind oder abhängige API verwenden, um das Token zu konsumieren. Bitte finden Master und Kind API Config für oauth Master API config:

public void ConfigureOAuth(IAppBuilder app) 
     { 
      //configure OAuth using owin framework 
      var oAuthOptions = new OAuthAuthorizationServerOptions() 
      { 
       AllowInsecureHttp = true, 
       TokenEndpointPath = new PathString("/api/token"), 
       AccessTokenExpireTimeSpan = TimeSpan.FromHours(2), 
       Provider = new KatanaAuthorizationServerProvider() 

      }; 
      app.UseOAuthAuthorizationServer(oAuthOptions); 
      app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()); 
     } 

Child API config:

public void ConfigureAuth(IAppBuilder app) 
     { 
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()); 
     } 
+0

Es ist alt, aber ich glaube nicht, Sie richtig verstanden. Es gibt einige Anfragen, die ich nicht initiiere oder nicht kontrollieren kann, aber ich muss in der Lage sein, das Token zu übergeben. –