7

Ich habe ein Szenario, das ich nicht in der Lage zu lösen:UrlHelper und Viewcontext innerhalb eines Berechtigungs Attribut

ich um meine eigene benutzerdefinierte Berechtigungs Attribut liebäugelt bin für mvc mit dem Erstellen. Die Hauptfunktionalität, die ich hinzufügen möchte, besteht darin, die Möglichkeit zu haben, zu ändern, wo der Benutzer umgeleitet wird, wenn er sich nicht in einer bestimmten Rolle befindet. Es macht mir nichts aus, dass das System sie zurück an die Anmeldeseite sendet, wenn sie nicht authentifiziert sind, aber ich möchte wählen, wo sie gesendet werden sollen, wenn sie authentifiziert sind, aber nicht auf diese Aktionsmethode zugreifen dürfen.

Hier ist, was ich tun:

public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
     public string Action; 
     public string Controller; 

     protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) 
     { 
      // if User is authenticated but not in the correct role 
      string url = Url.Action(this.Action, this.Controller);     
      httpContext.Response.Redirect(url); 
     } 
    } 

Und als zusätzlichen Bonus würde ich gerne Zugriff auf Viewcontext und TempData haben, bevor ich die Umleitung tun.

Irgendwelche Gedanken darüber, wie ich einen UrlHelper und ViewContext in das Attribut instanziieren könnte?

Antwort

11

Sie könnten die OnAuthorization Methode überschreiben:

public override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    if (filterContext == null) 
    { 
     throw new ArgumentNullException("filterContext"); 
    } 

    // Call the AuthorizeCore which should return true or false 
    if (!this.AuthorizeCore(filterContext.HttpContext)) 
    { 
     filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary() 
     { 
      { "controller", "home" }, 
      { "action", "about" }, 
      { "id", "foo" }, 
     }); 
    } 
} 

Soweit Viewdata und TempData betroffen sind: filterContext.Controller.ViewData und filterContext.Controller.TempData sollten innerhalb der OnAuthorization Methode arbeiten. Und schließlich, wenn Sie ein UrlHelper verwenden möchten (in diesem Fall gibt es keine Notwendigkeit, weil RedirectToRouteResult besser ist), könnten Sie es instanziiert:

var urlHelper = new UrlHelper(filterContext.RequestContext); 
+1

Brilliant, thx. Nachdem ich Ihre Antwort angesehen hatte, wurde mir klar, dass ich einfach gefragt hätte: "Wie gehe ich vor, um den AuthorizationContext zu bekommen?" Sobald ich das habe, bin ich gefährlich. –

+0

Hinweis: Die Implementierung einer OnAuthorization() -Methode ist keine einfache Übung. Wenn Sie OnAuthorization() anstelle von AuthorizeCore() überschreiben, fügen Sie Code in OnAuthorization() hinzu, um das Ausgabe-Caching zu deaktivieren oder zu aktivieren. Weitere Informationen finden Sie unter http://forums.asp.net/p/1533590/3737756.aspx. – Levi

Verwandte Themen