2009-06-02 18 views
5

En nuestra aplicación ASP.NET MVC, redirigimos automáticamente a los usuarios a una página de inicio de sesión a través de la sección <authentication> de <system.web> cuando intentan acceder a una página de solo autorización. El problema es que una acción en el medio de la aplicación, diseñada para ser utilizada por una herramienta, debe devolver una respuesta HTTP 401 directa en caso de acceso incorrecto. ¿Cómo puedo devolver un código HTTP 401 real sin el redireccionamiento para esta acción específica?Anular autenticación de formularios ASP.NET para una sola página

Respuesta

6

La siguiente solución funciona, aunque no estoy del todo seguro de que es óptima:

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(); 
    } 
} 

A continuación, puede devuelve el resultado anterior en lugar de HttpUnauthorizedResult para generar el código 401 requerido. Sin embargo, esto se siente bastante optimista para mí.

4

Usted puede tener distintas secciones para <system.web> caminos separados. He aquí un ejemplo:

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

En este caso, la página "Foo/Bar.aspx" se permite a la gente con el papel goodguys, pero negó a todos los demás.

En su caso, es posible que desee permitir a todos sin autenticación:

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

Si esto fuera recta de ASP.NET, que quiere trabajar, pero estoy claro cómo utilizar esta técnica con ASP.NET MVC. El problema es que las URL de deber-devolver-401 están en myapp/{parámetro de ruta}/herramienta; no hay forma de especificar eso en system.web, incluso si quisiera. –

+0

* blush * No vi "MVC" cuando leí tu publicación. – Randolpho

+0

Aunque esto funciona para el elemento de la autorización, que no funciona para la autenticación - me sale el siguiente error: producido un error durante el procesamiento de un archivo de configuración necesario para atender esta solicitud. Revise los detalles de error específicos a continuación y modifique su archivo de configuración de manera adecuada. Es un error utilizar una sección registrada como allowDefinition = 'MachineToApplication' más allá del nivel de la aplicación. –

0

Tenía un caso similar en el que necesitaba devolver algo que desencadenaba un redireccionamiento no deseado (básicamente, un mensaje sobre cómo la autenticación falló y estaba redirigiendo a la pantalla de inicio de sesión sin la información de error).

Esto resolvió el problema:

Response.SuppressFormsAuthenticationRedirect = true; 
Cuestiones relacionadas