5

In unserer ASP.NET MVC-Anwendung leiten wir Benutzer automatisch über den Abschnitt an eine Anmeldeseite weiter, wenn sie versuchen, auf eine autorisierte Seite zuzugreifen. Das Problem besteht darin, dass eine Aktion in der Mitte der Anwendung, die von einem Tool verwendet werden soll, eine direkte HTTP 401-Antwort bei schlechtem Zugriff zurückgeben muss. Wie kann ich einen echten HTTP 401-Code ohne die Umleitung für diese bestimmte Aktion zurückgeben?Überschreiben der ASP.NET-Formularauthentifizierung für eine einzelne Seite

Antwort

6

Die folgende Lösung funktioniert, obwohl ich es optimal gar nicht sicher bin:

public class HttpAuthenticationRequiredResult : ActionResult 
{ 
    public override void ExecuteResult(ControllerContext context) 
    { 
     var response = context.HttpContext.Response; 
     response.StatusCode = 401; 
     response.AddHeader("WWW-Authenticate", "Basic realm=\"whatever\""); 
     response.Flush(); 
     response.Close(); 
    } 
} 

Sie können dann gebe das obige Ergebnis anstelle eines HttpUnauthorizedResult zurück, um den erforderlichen 401-Code zu erzeugen. Das fühlt sich für mich sehr klugig an.

4

Sie können getrennte Abschnitte <system.web> für separate Pfade haben. Hier ein Beispiel:

<configuration> 
    <location path="Foo/Bar.aspx"> 
    <system.web> 
     <authorization> 
     <allow roles="GoodGuys" /> 
     <deny users="*"/> 
     </authorization> 
    </system.web> 
    </location> 
</configuration> 

In diesem Fall wird die Seite „Foo/Bar.aspx“ mit The Good Guys Rolle Leuten erlaubt, aber zu allen anderen verweigert.

In Ihrem Fall, Sie könnten alle ohne Authentifizierung zulassen möchten:

<configuration> 
    <location path="Foo/Bar.aspx"> 
    <system.web> 
     <authentication mode="None" /> 
     <authorization> 
     <allow users="*" /> 
     </authorization> 
    </system.web> 
    </location> 
</configuration> 
+0

Wenn diese ASP.NET straight-up waren, dass das funktionieren würde, aber ich bin nicht klar, wie diese Technik mit ASP.NET MVC zu verwenden. Das Problem besteht darin, dass die URLs "should-return-401" bei myapp/{root parameter}/tool sind; Es gibt keine Möglichkeit, das in system.web anzugeben, auch wenn ich es wollte. –

+0

* blush * Ich habe "MVC" nicht gesehen, als ich deinen Beitrag gelesen habe. – Randolpho

+0

Obwohl dies für das Autorisierungselement funktioniert, funktioniert es nicht für die Authentifizierung. Ich erhalte den folgenden Fehler: Bei der Verarbeitung einer Konfigurationsdatei ist ein Fehler aufgetreten, der für die Bearbeitung dieser Anforderung erforderlich ist. Bitte lesen Sie die spezifischen Fehlerdetails unten und ändern Sie Ihre Konfigurationsdatei entsprechend. Es ist ein Fehler, einen Abschnitt zu verwenden, der als allowDefinition = 'MachineToApplication' über die Anwendungsebene hinaus registriert ist. –

0

Hatte einen ähnlichen Fall, in dem ich etwas zurückgeben musste, das eine unerwünschte Weiterleitung ausgelöst hat (im Grunde eine Nachricht darüber, wie die Authentifizierung fehlgeschlagen ist und es auf den Anmeldebildschirm ohne die Fehlerinformationen umgeleitet wurde).

Dies löste das Problem:

Response.SuppressFormsAuthenticationRedirect = true; 
Verwandte Themen