2016-04-22 5 views
11

Ich verwende OWIN/OAuth mit OpenId Connect-Authentifizierung (Microsoft.Owin.Security.OpenIdConnect) in einer C# ASP MVC-Webanwendung. Die SSO-Anmeldung mit Microsoft-Konto funktioniert grundsätzlich, aber von Zeit zu Zeit bekomme ich eine Fehlerseite im Browser, die sagt Bad Request - Request Too Long.Zu viele Cookies OpenIdConnect.nonce verursacht Fehlerseite "Ungültige Anforderung - Anforderung zu lang"

Ich habe festgestellt, dass dieser Fehler durch zu viele Cookies verursacht wird. Das Löschen von Cookies hilft für einige Zeit, aber nach einer Weile kommt das Problem zurück.

Die Cookies, die das Problem verursachen, werden vom OpenId-Framework festgelegt, daher gibt es Dutzende von Cookies mit Namen wie OpenIdConnect.nonce.9oEtF53WxOi2uAw........

Dies ist keine SPA-Anwendung, aber einige Teile werden regelmäßig mit Ajax-Aufrufen aktualisiert.

Antwort

25

Es stellte sich heraus, dass die Ursache der Ajax-Aufruf war.

Die problematische Strömung war

1) OAuth Cookie

2) Expiration normalerweise Umleitung bewirkt, dass die Seite login.microsoft.com nach einiger Zeit abgelaufen bekam das Cookie zu aktualisieren. In diesem Schritt fügt das OAuth-Framework der Antwort (jedes Mal) einen neuennonce Cookie hinzu!

3) Aber Ajax behandelt Umleitungen außerhalb der Domäne nicht (Cross-Domäne zu login.microsoft.com). Aber der Cookie wurde bereits an die Seite angehängt.

4) Der nächste periodische Ajax-Aufruf wiederholte den Fluss und verursachte einen schnellen Anstieg von "Nonce" -Cookies.

Lösung

ich den "OWIN OpenId" Framework Setup-Code erweitern musste Ajax behandeln Anrufe anders - Umleitung zu verhindern und Senden von Cookies zu stoppen.

public void ConfigureAuth(IAppBuilder app) 
{ 
    app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 
    app.UseCookieAuthentication(new CookieAuthenticationOptions()); 

    app.UseOpenIdConnectAuthentication(
     new OpenIdConnectAuthenticationOptions 
     { 
      ClientId = clientId, 
      Authority = authority, 
      Notifications = new OpenIdConnectAuthenticationNotifications 
      { 
       RedirectToIdentityProvider = ctx => 
       { 
        bool isAjaxRequest = (ctx.Request.Headers != null && ctx.Request.Headers["X-Requested-With"] == "XMLHttpRequest"); 

        if (isAjaxRequest) 
        { 
         ctx.Response.Headers.Remove("Set-Cookie"); 
         ctx.State = NotificationResultState.HandledResponse; 
        } 

        return Task.FromResult(0); 
       } 
      } 
     }); 
} 

Der Ajax Anrufer hatte auch angepasst werden 401 Code zu erkennen und vollständige Aktualisierung der Seite durchführen (was eine schnelle Weiterleitung an Microsoft Behörde verursacht).

+1

Vielen Dank. Ich hatte ein ähnliches Problem und das hat geholfen, es zu lösen. – Namrehs

+0

Dies schien auch mein Problem zu lösen, nachdem ich die Chromkekse gereinigt hatte. Ironischerweise hat MSs neuer Browser Edge .... genau so viele Inkonsistenzen und Performance-Probleme wie der IE, also bin ich jetzt wieder bei Chrome. –

+0

löste mein Problem auch. Danke –

0

In meinem Fall war das Problem die Reihenfolge, in der ich die Anwendung innerhalb Startup.cs konfigurierte.

Erinnerung an sich selbst - immer die Authentifizierung zuerst konfigurieren!

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 
     app.UseCookieAuthentication(new CookieAuthenticationOptions()); 
     app.UseOpenIdConnectAuthentication(
      new OpenIdConnectAuthenticationOptions 
      { 
       ClientId = _clientId, 
       ClientSecret = _clientSecret, 
       Authority = _authority, 
       RedirectUri = _redirectUri 
      }); 

     // configure the rest of the application... 
    }