2012-07-15 11 views
20

così ho il mio metodo d'azioneCome implementare l'attributo Autorizza personalizzato per il seguente caso?

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

Nel mio caso ho bisogno di autorizzare gli amministratori in modo che possano modificare i messaggi ma (qui viene la parte fredda), ho anche bisogno di permettere il creatore del post per essere in grado per modificare il post che è un utente normale. Quindi, come posso filtrare l'utente che ha creato il post e gli amministratori ma lasciare gli altri non autorizzati? Sto ricevendo l'ID PostEntry come parametro del percorso ma questo dopo l'attributo e anche gli attributi accettano solo parametri costanti, sembra qualcosa di molto difficile, le tue risposte sono molto apprezzate, Saluti!

+1

Dal momento che non si può sapere chi ha creato la carica fino a quando si guarda in su. Potrebbe essere meglio includere questa logica dopo aver idratato l'oggetto. Altrimenti, se lo implementi come aspetto, potresti dover controllare due volte il post (una volta per l'autorizzazione e una volta per la modifica). –

+0

un punto ben messo, anzi cercherò una volta se il suo id è sulla voce di ruolo e di nuovo per fare la logica del mio controller. Qualche idea su come colpire il database una sola volta? – Freeman

+0

Pensando a questo un po 'di più, se si sta utilizzando un buon ORM e si imposta il contesto prima della chiamata di autorizzazione (non sono sicuro di quella parte), allora dovrebbe memorizzare nella cache di primo livello. Quindi, non dovresti vedere un colpo nel secondo idrato. –

risposta

42

Si potrebbe scrivere un attributo autorizzare personalizzato:

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(); 
    } 
} 

e poi decorare la vostra azione di controllo con esso:

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

Grazie !!! È esattamente quello di cui avevo bisogno !!! – TamarG

+0

Perché _ // Ora id è stato specificato => non è consentito l'accesso_? –

+0

** Ora vedo ** è necessario cambiare: _ // Ora id è stato specificato_ a ** NO ** id è stato specificato .... (sembra che se c'è un ID non permettiamo l'accesso) –

Problemi correlati