2008-08-29 20 views
6

Estoy escribiendo una aplicación que utiliza asp.net-mvc que se implementa en iis6. Estoy usando autenticación de formularios. Por lo general, cuando un usuario intenta acceder a un recurso sin la autorización adecuada, quiero que se redirija a una página de inicio de sesión. FormsAuth hace esto para mí con bastante facilidad.Bypass Forms Autenticación automática de redireccionamiento para iniciar sesión, ¿cómo?

Problema: Ahora tengo acceso a una acción desde una aplicación de consola. ¿Cuál es la forma más rápida de responder a esta acción con el estado 401 en lugar de redirigir la solicitud a la página de inicio de sesión?

Quiero que la aplicación de la consola pueda reaccionar a este 401 StatusCode en lugar de ser transparente. También me gustaría mantener las solicitudes desautorizadas redirigidas por defecto para el comportamiento de la página de inicio de sesión.

Nota: Como una prueba he añadido esto a mi global.asax y no lo hizo formas de derivación de autenticación:

protected void Application_AuthenticateRequest(object sender, EventArgs e) 
{ 
    HttpContext.Current.SkipAuthorization = true; 
} 

@Dale y Andy

estoy usando el AuthorizeAttributeFilter proporcionado en MVC preview 4. Esto está devolviendo un HttpUnauthorizedResult. Este resultado establece correctamente el código de estado en 401. El problema, tal como lo entiendo, es que asp.net está interceptando la respuesta (ya que es taged como 401) y redirigiendo a la página de inicio de sesión en lugar de simplemente dejarla pasar. Quiero omitir esta intercepción para ciertas URL.

+1

Ver http://stackoverflow.com/questions/2839406/forms-authentication-disable-redirect-to-the-login-page –

Respuesta

5

Ok, he trabajado alrededor de esto. Hice un ActionResult personalizado (HttpForbiddenResult) y un ActionFilter personalizado (NoFallBackAuthorize).

Para evitar la redirección, HttpForbiddenResult marca las respuestas con el código de estado 403. FormsAuthentication no detecta las respuestas con este código, por lo que la redirección de inicio de sesión se omite de manera efectiva. El filtro NoFallBackAuthorize comprueba si el usuario está autorizado de forma muy similar al filtro Authorize incluido. Difiere en que devuelve HttpForbiddenResult cuando se deniega el acceso.

El HttpForbiddenResult es bastante trivial:

 
public class HttpForbiddenResult : ActionResult 
{ 
    public override void ExecuteResult(ControllerContext context) 
    { 
     if (context == null) 
     { 
      throw new ArgumentNullException("context"); 
     } 
     context.HttpContext.Response.StatusCode = 0x193; // 403 
    } 
} 

No parece ser posible omitir la redirección de la página de inicio de sesión en el FormsAuthenticationModule.

+0

Hice lo mismo. Este chico piensa que es lo correcto para hacer de todos modos: http://danielirvine.com/blog/2011/07/18/understanding-403-forbidden –

-1

hice algunas google y esto es lo que ocurrió:


    HttpContext.Current.Response.StatusCode = 401; 

No estoy seguro de si funciona o no, yo no lo he probado. De cualquier manera, vale la pena intentarlo, ¿verdad? :)

0

¿Escribiste tu propio atributo FormsAuth para la acción? Si es así, en el método OnActionExecuting, se pasa el FilterExecutingContext. Puede usar esto para devolver el código 401.

public class FormsAuth : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(FilterExecutingContext filterContext) 
    { 
     filterContext.HttpContext.Response.StatusCode = 401; 
     filterContext.Cancel = true; 
    } 
} 

Esto debería funcionar. No estoy seguro de si escribió el atributo FormsAuth o si lo obtuvo de otro lugar.

0

No he utilizado el AuthorizeAttribute incluido en la Vista previa 4. Puse el mío, porque he estado usando el framework MVC desde el primer CTP. Eché un vistazo rápido al atributo en reflector y está haciendo lo que mencioné arriba internamente, excepto que usan el equivalente hexadecimal de 401. Tendré que buscar más arriba en la llamada, para ver dónde se capta la excepción, porque más de es probable que sea allí donde están haciendo la redirección. Esta es la funcionalidad que deberá anular. No estoy seguro si puedes hacerlo todavía, pero publicaré cuando lo encuentre y te daré una vuelta, a menos que Haacked vea esto y lo publique él mismo.

1

Podría ser un error (y puede que ni siquiera funcione) pero en su página de inicio de sesión ver si Request.QueryString["ReturnUrl"] != null y si así lo establece Response.StatusCode = 401.

Tenga en cuenta que igual necesitará que la aplicación de la consola se autentique de alguna manera. No obtienes autenticación básica de HTTP de forma gratuita: tienes que hacer tu propia, pero hay muchas implementaciones.

+0

Esto no ayuda por las razones descritas por TheDeeno. –

Cuestiones relacionadas