2011-05-07 21 views
15

¿Cómo puedo crear un AuthorizeAttribute personalizado que especifique un mensaje en forma de un parámetro de cadena y luego lo transfiera a la página de inicio de sesión?MVC 3 AuthorizeAttribute Redirigir con mensaje personalizado

Por ejemplo, lo ideal sería que estaría bien para hacer esto:

[Authorize(Message = "Access to the blah blah function requires login. Please login or create an account")] 
public ActionResult SomeAction() 
{ 
    return View(); 
} 

Luego, en la acción de acceso, lo que podía hacer algo como esto:

public ActionResult Login(string message = "") 
{ 
    ViewData.Message = message; 

    return View(); 
} 

Y finalmente en la vista de lo puede hacer esto:

@if (!String.IsNullOrEmpty(ViewData.Message)) 
{ 
    <div class="message">@ViewData.Message</div> 
} 

<form> blah blah </form> 

Básicamente quiero pasar un mensaje personalizado a la página de inicio de sesión para que pueda mostrar un mensaje específico a lo que el usuario está tratando de acceder en ese momento en particular.

Respuesta

23

Usted puede intentar algo como esto:

public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
    public string Message { get; set; } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     var result = new ViewResult(); 
     result.ViewName = "Login.cshtml";  //this can be a property you don't have to hard code it 
     result.MasterName = "_Layout.cshtml"; //this can also be a property 
     result.ViewBag.Message = this.Message; 
     filterContext.Result = result; 
    } 

Uso:

[CustomAuthorize(Message = "You are not authorized.")] 
    public ActionResult Index() 
    { 
     return View(); 
    } 
+3

Qué pasaría si quisiera volver a dirigir a un parámetros específicos/enrutamiento Vista/Controlador, ¿cómo sería? – ClayKaboom

+1

@ClayKaboom Ver esta publicación http://stackoverflow.com/questions/2472578/is-it-possible-to-use-redirecttoaction-inside-a-custom-authorizeattribute-clas – user1477388

+0

Tenga en cuenta que probablemente no desee incluir el ".cshtml" en la propiedad ViewName. Cuando lo hice, busqué Login.cshtml.cshtml. – AaronSieb

3

web.config

<authentication mode="Forms"> 
     <forms name="SqlAuthCookie" 
      loginUrl="~/Account/LogOnYouHavenotRight" 
      timeout="2880"  /> 
</authentication> 

controlador:

public ActionResult LogOn() 
    { 
     return View(); 
    } 

    public ActionResult LogOnYouHavenotRight() 
    { 
     return View(); 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult LogOn(LogOnModel model, string returnUrl) 
    { 
    } 

En ambos Vistas:

Html.BeginForm("LogOn", "Account") 
+0

solo parte de la respuesta completa, pero si lees los demás, podrías ser lo suficientemente inteligente como para sumarlos de modo +1 de todos modos ... – ppumkin

Cuestiones relacionadas