2016-04-08 9 views
0

Ich habe seit einigen Tagen mit einem seltsamen Problem mit OWIN Cookie Middleware (3.0.1) gekämpft.OWIN Cookie Middleware mit web.config Autorisierungselementen

Ich habe das Problem mit einem minimalen Codebeispiel neu erstellt. Erstellen Sie zuerst ein leeres ASP.NET-Webanwendungsprojekt (VS.NET 2015). Und die OWIN nuget Pakete etc ... Und eine grundlegende Startup-Klasse hier:

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

     app.Use(async (context, next) => 
     { 
      // context.Response.StatusCode = 200 here 
      Debug.WriteLine("1. ==> Request - Before Cookie Auth"); 
      await next(); 
      // context.Response.StatusCode = 401 here 
      Debug.WriteLine("4. <== Response - After Cookie Auth"); 
     }); 

     app.UseCookieAuthentication(new CookieAuthenticationOptions()); 

     // by adding this element to web.config, the next middle is no longer used, the request ends with 401.2 
     // <authorization> 
     // <deny users="?" /> 
     // </authorization> 

     app.Use(async (context, next) => 
     { 
      // I thought this middleware would be hit so it could deal with 401 - issue challenge 
      // e.g. app.UseOpenIdConnectAuthentication etc... 
      Debug.WriteLine("2. ==> After Cookie Auth, Never Hit!! if web.config has <authorization>< deny users = \"?\" /> "); 
      await next(); 
      Debug.WriteLine("3. <== Never hit"); 
     }); 
    } 
} 

Der Code funktioniert wie erwartet, bis ich das Folgeelement an der web.config

<authorization> 
    <deny users="?" /> 
</authorization> 

Meine zweite OWIN Middleware hinzufügen jetzt wird nicht mehr angerufen. In diesem Beispiel seine einfachen Protokollierungsanweisungen, aber in einem größeren Projekt seine app.UseOpenIdConnectAuthentication.

Mein Verständnis war, dass der 401-Status würde von anderen Authentifizierung Middleware behandelt werden und wiederum eine Herausforderung Antwort erstellen.

Aber nichts nachdem die Cookie-Middleware aufgerufen wird. Die Antwort kehrt einfach mit einem 401.2

zurück. Dies geschieht sowohl mit lokalen IIS und IIS Express.

Antwort

1

Add nach app.UseCookieAuthentication folgenden Code:

app.UseStageMarker(PipelineStage.Authenticate); 

Dies wird Owin anweisen, in der integrierten Pipeline zu laufen.