2009-08-25 14 views
11

Tengo un proyecto ASP.NET MVC, y me gustaría tener un LoginUrl diferente para diferentes áreas del sitio web. Dependiendo del área del sitio, se ingresan diferentes tipos de credenciales.Diferentes LoginUrl para diferentes URL con ASP.NET MVC y Autenticación de formularios

http://host.com/widget/home debe redirigir al usuario a http://host.com/widget/logon.

http://host.com/admin/home debe redirigir al usuario a http://host.com/admin/logon.

Hasta el momento, la mejor solución que he llegado con, es tener las formas de autenticación loginUrl = "~/cuenta/Inicio de sesión" en el web.config:

<authentication mode="Forms"> 
     <forms loginUrl="~/Account/LogOn" timeout="2880"/> 
    </authentication> 

En el controlador de la cuenta:

public ActionResult LogOn() 
{ 
    //redirect depending on the returnUrl? 
    string returnUrl = ControllerContext.Controller.ValueProvider["ReturnUrl"].AttemptedValue; 
    if (returnUrl.StartsWith("/widget")) 
    { 
     return Redirect(string.Format("/widget/Logon?ReturnUrl={0}", returnUrl)); 
    } 
    if (returnUrl.StartsWith("/admin")) 
    { 
     return Redirect(string.Format("/admin/Logon?ReturnUrl={0}", returnUrl)); 
    } 
    return View(); 
} 

¿Hay una manera mejor de hacer esto?

+1

BTW: puede simplemente poner returnUrl como un parámetro de cadena para el método: LogOn (string returnUrl) –

Respuesta

1

Sé que puede tener archivos web.config separados en las subcarpetas de un sitio web, de modo que si tuviera páginas .aspx reales dentro de una carpeta/administrador, y un archivo web.config en esa carpeta, podría especificar la URL de autenticación en esa carpeta por separado.

No estoy seguro si eso funciona con las rutas ASP.NET MVC ya que probablemente no tengas archivos físicos en esas subcarpetas, pero vale la pena intentarlo.

+2

En las áreas de MVC tiene web.config por separado, pero es probable que termine con el error si intenta agregar el atributo de autenticación: es un error utilizar una sección registrada como allowDefinition = 'MachineToApplication' más allá del nivel de la aplicación. Este error puede deberse a que un directorio virtual no está configurado como una aplicación en IIS. – Jafin

1

Agregue el atributo Autenticar a sus acciones.

Luego, en global.asax agregue Application_AuthenticateRequest, luego mire al remitente y redirija allí donde desea que inicie la acción.

+0

Solo tengo curiosidad, pero esto parece ser similar a lo que había hecho originalmente, solo en un lugar diferente. ¿Cuáles son las ventajas de hacerlo de esta manera? – mlsteeves

Cuestiones relacionadas