2017-03-28 3 views
0

Ich benutze Umbraco 7.5 mit einer OWIN-Startup-Klasse.Umbraco Web API - Cookie-Authentifizierung

Trotz der Unzulänglichkeiten bei der Verwendung von Cookie-Authentifizierung versuche ich, die Cookie-Authentifizierung zwischen MVC und Web-API zu teilen.

Ich habe dies in meiner OWIN Startklasse:

private static void ConfigureAuth(IAppBuilder app) 
{ 
    app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 

    CookieSecureOption secureCookieOption = CookieSecureOption.SameAsRequest; 
#if DEBUG 
    secureCookieOption = CookieSecureOption.Never; 
#endif 

    app.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
     AuthenticationType = CookieAuthenticationDefaults.AuthenticationType, 
     AuthenticationMode = AuthenticationMode.Active, 
     LoginPath = new PathString("/Account/Login"), 
     CookieSecure = secureCookieOption, 
     CookieManager = new ChunkingCookieManager(), 
     Provider = new CookieAuthenticationProvider() 
     }, PipelineStage.Authenticate); 

    //configure B2C OAuth middleware 
    foreach (string policy in AppSettings.B2CPolicies) 
    { 
     app.UseOpenIdConnectAuthentication(CreateBearerOptionsFromPolicy(policy)); 
    } 

    // Use a cookie to temporarily store information about a user logging in with a third party login provider 
    app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 
} 

Dies funktioniert gut, so weit wie die Umbraco & benutzerdefinierten MVC Seiten betroffen sind - die aktuelle Benutzeridentität ist verfügbar und die Umbraco Helfer Methoden funktionieren wie erwartet.

Für Web-API-Controller - ob von UmbracoApiController oder nur von ApiController abgeleitet - ist die aktuelle Benutzeridentität im HTTP-Kontext jedoch immer null. Ich habe überprüft, dass die Browseranforderung an die API-Controller gesendet wird, und der ASPNET-Identitätscookie ist enthalten. Daher bin ich verwirrt, warum dies nicht zu einer Benutzeridentität im Thread & httpcontext führt. Wer könnte das beleuchten?

Edit: einige weitere Informationen über this- Ich habe versucht, meine eigene benutzerdefinierte Cookie Authentifizierungs-Middleware zu schaffen und ersetzt die Standard-MS CookieAuthenticationHandler mit meiner benutzerdefinierten Implementierung, so dass ich könnte die Anrufe durch sie verfolgen. Interessanterweise wird für eine normale MVC Seite die AuthenticateCoreAsync-Methode beim Laden der Seite aufgerufen, , die den Cookie erfolgreich liest und ein gültiges Authentifizierungsticket zurückgibt. Für den Web-API-Aufruf wird die AuthenticateCoreAsync-Methode nicht aufgerufen, bevor die API-Methode aufgerufen wird.

Antwort

0

Ich fand die Antwort darauf - es war nichts mit OWIN zu tun, und alles mit meinem Web-API-Initialisierungscode zu tun. Ich habe den für die Web-API für das Selbsthosten erforderlichen Code mit dem Code gemischt, der erforderlich ist, damit die Web-API als Teil der MVC-App ausgeführt wird. Statt IAppBuilder.UseWebApi() Ich GlobalConfiguration.Configure() verwendet haben sollte

So ist der Arbeits Code etwa wie folgt aussieht:

public static void Configure(IAppBuilder app) 
{ 
    GlobalConfiguration.Configure(Register); 
} 

private static void Register(HttpConfiguration config) 
{ 
    ConfigureHttpRoutes(config); 

    ConfigureFormatters(config); 

    //etc... 
} 

Ein ähnliches Problem in this SO question aufgetreten.