2012-07-15 5 views
20

, so habe ich meine Aktion MethodeWie benutzerdefinierte Autorize-Attribut für den folgenden Fall implementieren?

[Authorize(Roles="Admin")] 
public ActionResult EditPosts(int id) 
{ 
    return View(); 
} 

In meinem Fall muss ich Administratoren genehmigen, so dass sie Beiträge editieren, aber (hier kommt das kühle Teil), ich muss auch der Schöpfer der Post ermöglichen zu können, um den Beitrag zu bearbeiten, der ein normaler Benutzer ist. Also, wie kann ich den Benutzer, der den Post erstellt hat, sowie die Admins herausfiltern, aber die anderen nicht autorisieren lassen? Ich empfange die PostEntry ID als Routenparameter, aber das ist nach dem Attribut und auch Attribute akzeptieren nur konstante Parameter, sieht aus wie etwas sehr schwierig, Ihre Antworten sind sehr geschätzt, Prost!

+1

Da können Sie nicht wissen, wer die Post erstellt, bis Sie es nachschlagen. Es könnte besser sein, diese Logik nach dem Hydratisieren des Objekts hinzuzufügen. Andernfalls, wenn Sie dies als einen Aspekt implementieren, müssen Sie möglicherweise den Post zweimal nachschlagen (einmal für die Autorisierung und einmal für die Bearbeitung). –

+0

ein Punkt gut gestellt, in der Tat werde ich einmal nachschlagen, wenn seine ID auf dem Rolleneintrag ist und wieder meine Controller-Logik zu tun. Irgendwelche Ideen, wie man die Datenbank nur einmal trifft? – Freeman

+0

Denken Sie darüber nach, wenn Sie ein gutes ORM verwenden und den Kontext vor dem Autorisierungsaufruf (nicht sicher über diesen Teil) einstellen, dann sollte er im Cache der 1. Ebene zwischengespeichert werden. Dann sollten Sie auf dem zweiten Hydrat nicht so etwas wie einen Treffer sehen. –

Antwort

42

Sie können eine benutzerdefinierte autorisieren Attribut schreiben:

public class AuthorizeAdminOrOwnerOfPostAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var authorized = base.AuthorizeCore(httpContext); 
     if (!authorized) 
     { 
      // The user is not authenticated 
      return false; 
     } 

     var user = httpContext.User; 
     if (user.IsInRole("Admin")) 
     { 
      // Administrator => let him in 
      return true; 
     } 

     var rd = httpContext.Request.RequestContext.RouteData; 
     var id = rd.Values["id"] as string; 
     if (string.IsNullOrEmpty(id)) 
     { 
      // No id was specified => we do not allow access 
      return false; 
     } 

     return IsOwnerOfPost(user.Identity.Name, id); 
    } 

    private bool IsOwnerOfPost(string username, string postId) 
    { 
     // TODO: you know what to do here 
     throw new NotImplementedException(); 
    } 
} 

und dann mit ihm Ihre Controller-Aktion dekorieren:

[AuthorizeAdminOrOwnerOfPost] 
public ActionResult EditPosts(int id) 
{ 
    return View(); 
} 
+0

Danke !!! Es ist genau das, was ich brauchte !!! – TamarG

+0

Warum _ // Jetzt wurde die ID angegeben => wir erlauben keinen Zugriff_? –

+0

** Jetzt sehe ich ** Sie müssen ändern: _ // Jetzt ID wurde angegeben_ bis ** NEIN ** ID wurde angegeben .... (es scheint, dass wenn ID ist erlauben wir keinen Zugriff) –

Verwandte Themen