2008-10-26 21 views
5

Esta es probablemente una de esas preguntas fáciles. Estoy tratando de redirigir al usuario después de que se hayan autenticado correctamente, o devolverlo a la página de inicio de sesión. Pero la página de éxito está en una ruta diferente y no puedo conseguir la redirección a trabajar ..ASP.Net MVC - redirigir a la ruta da Redirect Loop

Éstos son mis rutas en Globals.asax:

routes.MapRoute(_ 
    "Default", _ 
    "{controller}/{action}/{id}", _ 
    New With {.controller = "Login", .action = "Index", .id = ""} _ 
    ) 
routes.MapRoute(_ 
    "Stuff", _ 
    "{controller}/{action}/{id}", _ 
    New With {.controller = "Stuff", .action = "Index", .id = ""} _ 
    ) 

Tengo 2 Controladores: LoginController.vb y StuffController.vb. El archivo Views/Login/Index.aspx contiene un sencillo formulario con el código:

<form method="post" action="/Login/Authenticate"> 

la LoginController contiene el siguiente código:

Function Authenticate() As RedirectToRouteResult 
    ' authentication code commented out ;o) 

    Return RedirectToRoute("Stuff") 
End Function 

Y el StuffController contiene lo siguiente:

Function Index() 
    ' show stuff.. 

    Return View() ' return /Views/Stuff/Index.aspx 
End Function 

Esto es lo que yo lo he intentado hasta ahora:

  • Función autenticación (pase)
  • Función autenticación (pase) Como ActionResult()
  • Función autenticación (pase) Como RedirectToRouteResult()

todo lo cual causa un tiempo de espera de redirección de bucle en el navegador. ¡¿Qué me estoy perdiendo?!

+0

¡Gran pregunta, estaba teniendo el mismo problema! – MrBoJangles

Respuesta

7

Podría ser que su ruta materia tiene exactamente la misma forma que la que viene por defecto, por lo que cuando se llama a

Return RedirectToRoute("Stuff"); 

la url resultante tiene la forma: {controlador}/{acción}/{id} , p.ej Inicie sesión/Autentique de nuevo, ya que se encuentra dentro de la acción Autenticar del controlador de inicio de sesión.

Trate de

RedirectToAction("Index", "Stuff"); 

Espero que ayude.

+0

Tu ' re corregir. Eliminé la ruta 'Cosas' y usé RedirectToAction ("[Ver]", "[Controlador]") y funciona, gracias por su ayuda: o) – Andrew

+0

Ah, y necesitaba cambiar el Tipo de devolución de la autenticación Función para "ActionResult" también: o) – Andrew

0

No veo dónde está configurando la cookie de autenticación o marcando al usuario como autenticado de alguna manera. ¿Está eso en el código que has omitido?

+0

Sí, puedo estar equivocado, pero no pensé que necesitaría ningún código de autenticación, ya que todo lo que estoy tratando de hacer aquí es 'saltar' Controladores - desde el Controlador de inicio de sesión al StuffController – Andrew

+0

Si no configura el código auth. cookie, siempre que sus métodos de acción estén decorados con el atributo [Authorize], se le redirigirá nuevamente a su url de inicio de sesión. – liggett78

+0

Gracias por la nota sobre el atributo [Autorizar]. La verdad es cuando estaba tratando de hacerlo funcionar. No había escrito el código de autorización, así que no decoré ningún Método de Acción con [Autorizar] - Solo estaba obteniendo el 'flujo' correcto para comenzar con: o) – Andrew

0

tratar

routes.MapRoute(_  
"Stuff", _ 
"",_ 
New With {.controller = "Stuff", .action = "Index", .id = ""} _  
) 
8

respuesta correcta es bueno, pero:

  • lo que si alguna vez desea cambiar el nombre/acción del controlador de Personal/Índice a otra cosa?

-entonces tendrá que cambiar los valores no solo en global.asax, sino también en todos los lugares donde utilizó la técnica.

Mi sugerencia:

return RedirectToRoute("Stuff", (RouteTable.Routes["Stuff"] as Route).Defaults); 

Ahora, en este caso, no pasa los nombres de controlador/acción que es la materia/Índice consecuencia. Esto te permitirá administrar cambios fácilmente.

+0

Me gusta - gracias por su respuesta: o) – Andrew

Cuestiones relacionadas