2012-07-20 10 views
7

Ich habe eine ASP.NET MVC3-Anwendung mit Windows-Authentifizierung auf IIS6 bereitgestellt. Wenn ein authentifizierter Benutzer auf einen Link klickt, zu dessen Anzeige er nicht berechtigt ist, werden er wie erwartet aufgefordert, seinen Benutzernamen und sein Passwort (in einem Browserdialog, nicht auf einer Seite) einzugeben.Erhalte leere Seite anstelle von 401 Fehlerseite

Nachdem ich jedoch dreimal auf Abbrechen oder ungültige Anmeldedaten geklickt habe, sehe ich eine leere weiße Seite, statt die nicht autorisierte 401-Seite zu sehen.

Wenn Sie Fiddler betrachten, gibt es drei Anfragen/Antworten, nachdem Sie auf Abbrechen geklickt haben. Hier sind die Antwort Zusammenfassungen und Header:

  1. ASP.NET Zugriff wird verweigert Nachricht (401,2)

    HTTP/1.1 401 Unauthorized Datum: Fr, 20. Juli 2012 14.34.21 GMT Server : Microsoft-IIS/6.0 WWW-Authenticate: Verhandeln WWW-Authenticate: NTLM X-Powered-By: ASP.NET X-ASPNET-Version: 4.0.30319 Cache-Control: privat Content-Type: text/html; charset = utf-8 Content-Length: 1701 Proxy-Support: Session-Based-Authentifizierung

  2. IIS Sie nicht diese Seite zu sehen sind berechtigt, (401,1)

    HTTP/1.1 401 Unauthorized Content- Länge: 1539 Content-Type: text/html Server: Microsoft-IIS/6.0 WWW-Authenticate: NTLM TlRMTVNTUAACAAAADAAMADgAAAAF ... (der Kürze halber weggelassen) X-Powered-By: ASP.NET Date: Fri, 20 Jul 2012 14:34:21 GMT Proxy-Unterstützung: Sitzungsbasierte Authentifizierung

  3. Leere Antwort

    HTTP/1.1 401 Unauthorized Datum: Fr, 20. Juli 2012 14.34.21 GMT Server: Microsoft-IIS/6.0 WWW-Authenticate: Verhandeln WWW-Authenticate: NTLM X-Powered-By: ASP.NET X-ASPNET-Version: 4.0.30319 X-AspNetMvc-Version: 3.0 Cache-Control: privat Content-Length: 0 Proxy-Support: Session-Based-Authentifizierung

Wie bekomme ich dies, um eine 401-Fehlerseite anzuzeigen?

Update 1:

Hier Abschnitt meine web.config Fehler.

<customErrors mode="RemoteOnly" defaultRedirect="~/Error" /> 

Ich verwende auch HandleErrorAttribute.

Ich vermute, dass IIS die leere Seite anstelle von ASP.NET zurückgibt, aber ich bin nicht sicher, wie das zu beweisen ist.

Update 2:

Das ist interessant.Wenn ich die leere Seite aktualisiere, sehe ich die Meldung ASP.NET-Zugriff verweigert.

+0

Nur eine Vermutung, aber versucht sie, sie auf die Seite Benutzername und Passwort zurückzuleiten, weil sie immer noch nicht autorisiert sind? Und da es denkt, dass es den Benutzer behandelt, hat die Ansicht nichts anzuzeigen? –

+0

Es ist keine Login-Seite, es ist der Browser-Login-Dialog. – jrummell

+0

Ah Entschuldigung, habe diesen Teil nicht gesehen. Nach dem dritten Versuch werden Sie sie auf die 401-Seite umleiten? Wenn nicht, bleiben Sie auf der gleichen Seite, aber Sie erhalten keinen Inhalt angezeigt, weil der Server keine sendet. –

Antwort

1

Ich kam mit dieser Arbeit um nach 401 Umleitung zu suchen, wie @AndrewHagner vorgeschlagen. Es basiert auf this answer. Ich implementierte AuthorizeAttribute und überschrieb HandleUnauthorizedRequest().

So wie ich verstehe, wird dies nicht autorisierte Anfragen in der MVC-Pipeline vor dem Senden an IIS fangen. Dies gibt mir die Möglichkeit, auf eine benutzerfreundliche nicht autorisierte Seite umzuleiten.

+0

Ich würde immer noch gerne wissen, warum ich ohne diese Seite eine leere Seite bekommen habe. – jrummell

+2

Nur lassen Sie die Linie 3 wissen 'wenn (filterContext.HttpContext.User.Identity.IsAuthenticated)' muss 'if (! FilterContext.HttpContext.User.Identity.IsAuthenticated)' – Azerothian

+0

Guter Fang sein! Ich habe den Code aktualisiert. – jrummell

0

sollten Sie versuchen, in Ihrer web.config Datei eine Regel, um den Benutzer auf diese Weise auf die nicht autorisierte Seite umleiten.

<System.Web> 
    //map all the erros presented in the application to the error.aspx webpage 
    <customErrors mode="RemoteOnly" defaultRedirect ="~/error.aspx"> 
    //redirect the user to a Error401.pasx Page after the server get an 401 Error 
    <error statusCode="401" redirect="Error401.aspx" /> 
    </customErrors> 
<System.Web> 

Ich hoffe, das funktioniert für Sie.

+0

zu implementieren, die keinen Unterschied machen. (und '' sollte ein Kind von '' sein) – jrummell

+0

Ihr Recht @jrummell, danke! –

Verwandte Themen