wake-up-neo.net

ASP.NET WindowsAuthentication benutzerdefiniert 401 Nicht autorisierte Fehlerseite

Ich habe eine ASP.NET-Website mit Authentifizierung unter Verwendung von ActiveDirectory. 

Jetzt wenn ein authentifizierter Benutzer eine Seite öffnet, wird er automatisch authentifiziert. Ich bin mit einem Problem konfrontiert - wenn ein nicht authentifizierter Benutzer ( beispielsweise ein Mozilla Firefox-Benutzer mit nicht definierter network.automatic-ntlm-auth.trusted-uris-Eigenschaft ) eine Seite öffnet, sendet IIS 401 eine Antwort und fordert zur Eingabe einer Passwort.

Was ich möchte, ist ihn nicht zur Eingabe eines Login-Passworts aufzufordern - einfach eine benutzerdefinierte Fehlerseite anzeigen. Das klingt ziemlich einfach - authentifizierte Benutzer erhalten die angeforderte Seite, nicht authentifizierte werden auf eine benutzerdefinierte Fehlerseite umgeleitet. Es würde gut für FormsAuthentication funktionieren. 

Ich habe jedoch schon so viele Möglichkeiten ausprobiert. Alle Web.config-Weiterleitungen funktionieren nicht. Selbst wenn ich eine Variable Response lösche und dort eine Weiterleitung einstelle, bekomme ich eine Schleife, da diese benutzerdefinierte Seite (* z. B. /Error/AccessDenied) auch eine Authentifizierung erfordert. Wenn Sie einen Controller als AllowAnonymous markieren, wird nichts ausgeführt.

Wenn ich jedoch die anonyme Authentifizierung in IIS Manager aktiviere, werden echte authentifizierte Domänenbenutzer beim Öffnen einer Website nicht autorisiert.

Wie kann ich dieses Problem lösen?

12

Danke an @Abhitalks für die Erklärung, wie es in Kommentaren funktioniert. Ich weiß nicht warum, aber ich war mir sicher, dass IE und Google Chrome bei der ersten Anforderung einen Autorisierungsheader senden. Aus diesem Grund erhalten nur nicht autorisierte Benutzer eine 401-Antwort. Nachdem ich verstanden habe, dass ich die Antwort von 401 überhaupt nicht vermeiden kann, habe ich mich für diesen einfachen Ansatz entschieden, da dieses Verhalten dem wünschenswertesten am nächsten kommt.

Ich habe die folgende Methode in Global.asax hinzugefügt:

protected void Application_EndRequest(object sender, EventArgs e)
{
    if (Response.StatusCode == 401)
    {
        Response.ClearContent();
        Response.WriteFile("~/Static/NotAuthorized.html");
        Response.ContentType = "text/html";
    }
}

Wenn nun ein Benutzer eine Seite öffnet, gibt der Server ihm eine benutzerdefinierte Fehlerseite mit 401 Unauthorized-Header zurück.

Chrome, IE oder gut konfigurierter Firefox . Der Benutzer fordert eine URL an, der Server gibt die Fehlerseite mit dem 401-Header zurück. Ein Browser führt automatisch eine Autorisierungsaufforderung aus, leitet auf dieselbe URL um, der Server gibt die richtige Seite und jetzt 200 zurück. Dem Benutzer wird diese Fehlerseite nicht angezeigt.

Nicht konfigurierter Firefox . Benutzer fordert eine URL an, der Server gibt die Fehlerseite mit dem 401-Header zurück - ein Browser kann die Autorisierungsaufforderung nicht abschließen und fordert den Benutzer zur Eingabe von Anmeldeinformationen auf.

  • Benutzer gibt korrektes Login ein . Benutzer fordert dieselbe URL erneut an, erhält eine Seite und 200 OK.

  • Benutzer gibt falsches Login ein . Ein Browser fordert erneut zur Eingabe von Anmeldeinformationen auf.

  • Benutzer drückt Abbrechen . Ein Browser zeigt die benutzerdefinierte Fehlerseite an, die mit dem Header 401 gesendet wurde. Diese Seite sagt dem Benutzer, dass er, wenn er Firefox verwendet, entweder seine Anmeldeinformationen eingeben oder die automatische NTLM-Authentifizierung zulassen sollte.

14

Wichtige Ergänzung zu Yeldars Kommentar:

Wenn Sie die Antwortnachricht für Remote-Anforderungen (read: non-localhost) ändern, müssen Sie Ihrer Konfigurationsdatei Folgendes hinzufügen:

<system.webServer>
    <httpErrors existingResponse="PassThrough"></httpErrors>
</system.webServer>

Wenn Sie nicht zulassen, dass die Antwort "weitergeleitet" wird, erhalten Remote-Clients den Standardcode "You do not have permission to view this directory or page".

Ich habe diese Informationen erhalten von: https://stackoverflow.com/a/17324195/3310441

2
KoenW

Überschreiben Sie die HandleUnauthorizedRequest-Methode im Authorize-Attribut.

Ex:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
   filterContext.Result = new RedirectToRouteResult(
                            new RouteValueDictionary (new {controller = "CustomError", action = "Unauthorized"}));
}
0
Sajithd