2011-05-06 17 views
20

¿Puedo tener URL de inicio de sesión diferente para diferentes áreas de ASP.NET MVC3?Tener diferentes páginas de inicio de sesión para diferentes áreas de ASP.NET MVC 3

p. Ej. Me gustaría tener una página de inicio de sesión diferente para administradores y operadores de entrada de datos.

Veo una web.config en la parte de vista de cada área y que han intentado hacer:

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

pero no juega bien.

Saludos.

+0

Curiosity está obteniendo lo mejor de mí; ¿Cuida compartir la razón particular por la que necesitas hacer esto? –

+0

Necesidad de separar la interfaz de inicio de sesión/completa de superadministrador del resto de los usuarios; estoy usando áreas separadas para todos los roles; – effkay

Respuesta

28

No estoy al tanto de .NET manejar esto para usted, pero usted podría crear una costumbre AuthorizationAttribute

public class CustomAuthorization : AuthorizeAttribute { 

    public string Url { get; set; } 

    public override void OnAuthorization(AuthorizationContext filterContext) { 

    if (!filterContext.HttpContext.User.Identity.IsAuthenticated) { 
     filterContext.HttpContext.Response.Redirect(Url); 
    } 
    base.OnAuthorization(filterContext); 

    } 

} 

un complemento que a los controladores/acciones

[CustomAuthorization(Url="/Area/Login")] 
public class HomeController { 
    //... 
} 
+0

Wohoo ... Estaba pensando exactamente en estas líneas ... déjame ver si puedo ordenarlo ... si puedo, obtendrás tus puntos :) – effkay

+0

¿No reemplazaría a HandleUnauthorizedRequest? ser un mejor lugar para manejar esto? –

8

Mi solución se basa en la solución presentada por David Glenn, gracias.

public class CustomAuthorization : AuthorizeAttribute 
{ 
    public string Url { get; set; } 

    // redirect to login page with the original url as parameter. 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     filterContext.Result = new RedirectResult(Url + "?returnUrl=" + filterContext.HttpContext.Request.Url.PathAndQuery); 
    } 
} 

y añadir el atributo a los controladores/acciones

[CustomAuthorization(Url="/Area/Login")] 
public class HomeController { 
    //... 
} 

es mejor que el uso filterContext.Result filterContext.HttpContext.Response.Redirect (URL) para redirigir debido a que el filtro actual redirigirá inmediatamente a la página de inicio de sesión; de lo contrario, se llamará a la acción original y solo se redireccionará a la página de inicio de sesión.

+0

esto es realmente útil – Ever

+0

Esto es mejor. – Diryboy

Cuestiones relacionadas