2010-05-20 14 views
5

Questo è il mio primo post qui, quindi ciao :) Va bene, andiamo al punto ... Sto scrivendo la mia prima app in ASP.NET MVC Framework e io avere un problema con il controllo dei privilegi per usare istanze di classi modello (leggi, modifica). Il codice di esempio è simile al seguente:Autorizzazione ASP.NET MVC e permesso di utilizzare le classi modello

// Controller action 

[CustomAuthorize(Roles="Editor, Admin")] 
public ActionResult Stats(int id) 
{ 
    User user = userRepository.GetUser(id); 

    if (user == null || !user.Activated || user.Removed) 
     return View("NotFound"); 
    else if (!user.IsCurrentSessionUserOwned) 
     return View("NotAuthorized"); 

    return View(user); 
} 

Finora autorizzare attributo protegge solo azioni di controllo, quindi la mia domanda è: come fare CustomAuthorize attribuire a verificare non solo dei ruoli utente, nomi utente, ma anche fatto cioè risorse istanziati nei metodi d'azione (sopra: classe utente, ma ci sono altre classi ORM LINQ2SQL come notizie, foto ecc.) Tutti questi oggetti da controllare hanno i loro ID univoci, quindi l'entità utente ha un proprio ID, le notizie hanno il loro ID e il campo ID utente referenziato alla tabella Utenti. Come dovrei risolvere quel problema?

risposta

1

Se ho capito bene, si vuole permettere all'utente che scrivono notizie, gli articoli da modificare la propria notizie o articoli anche se ha doesnt il ruolo di "amministratore" o "Editor" ..

Bene che è un ingannevole, la soluzione più semplice sarebbe:

Lasciate che il vostro CustomAuthorize come lo è, ma lasciarlo continuare l'azione, invece di restituire un errore di Vista o qualcosa solo iniettare un parametro di azione vale a dire:

CustomAuthorize:

//..Your Role Validation Logic Here... 
    if (filterContext.ActionParameters.Keys.Contains("isAuthorize")) 
     { 
     filterContext.ActionParameters.Remove("isAuthorize"); 
     } 
    filterContext.ActionParameters.Add("isAuthorize", isAuthorized); 

Dove isAuthorized terrà il risultato della logica di convalida del ruolo.

Così nel controller, è necessario aggiungere un secondo parametro:

[CustomAuthorize(Roles="Editor, Admin")] 
public ActionResult Stats(int id, bool isAuthorized) 
{ 
    User user = userRepository.GetUser(id); 

    if (user == null || !user.Activated || user.Removed) 
     return View("NotFound"); 
    else if (user.Id != CurrentUser.Id && !isAuthorized) 
      //not Authorized by roles 
      //not the owner get away from here =D 
     return View("NotAuthorized"); 

    return View(user); 
} 

Sto assumendo che ha accesso a un CurrentUser che viene da una proprietà in BaseController (classe abstrac).

Implementare qualcosa di più elaborato di quello si tradurrà in una situazione complessa.

Per esempio si può, ma non è raccomandato:

A. Invia l'userID del proprietario come parametro (in modo che ogni volta che si invia un ID sull'URL GET o POST richiesta, devi aggiungere l'ID utente di il proprietario come parametro). Ma questo può portare a problemi di sicurezza davvero brutti, perché si dipende dall'ID utente che viene inviato dal filo che può essere manomesso dall'utente e woala! sono autorizzato ora.

B. Provare ad istanziare l'oggetto nel filtro azione (ma è necessario capire prima quale entità si sta tentando di istanziare, questo può portare a un'istruzione switch lunga ea un terzo parametro in CustomAuthorize in modo da sapere quale entità per ottenere dal DB).

Problemi correlati