Domanda

Ci sono molte domande (e informazioni) per impostare l'iscrizione ASP.NET, i fornitori di ruoli e simili. Se è necessario utilizzare o meno la piattaforma integrata fornita da Microsoft, o il ruolo estende le classi di base e il tuo ruolo.

Ho deciso di estendere i fornitori predefiniti e attuare il mio adesione e i fornitori di ruoli. Ora la mia domanda, è specificamente attorno all'autenticazione del ruolo.

Tradizionalmente, creeresti i ruoli forse come "manager, amministratore, dipendente, super utente" o qualsiasi altra cosa tu abbia. Ma cosa farebbe / dovresti fare in relazione alle autorizzazioni che considero un grano più fine del controllo? Lasciami elaborare ....

All'interno del mio sito MVC ASP.NET Ho diverse aree come Amministrazione, Gestione, Messaggi, Messaggi, Messaggi, Direzione, Ecc. Vorrei calare ruoli per ognuno di questi come "amministratore", "manager", "reporter" ecc. Senza il ruolo appropriato , non è possibile accedere a quell'area del sito. Quindi bloccherei tutti i controller con questo a livello di classe.

Ma ora prendi una zona come esempio; Messaggi e dire che volevo avere permessi di grano più fini per crud; Creare un messaggio, visualizzare / leggi i messaggi, modifica messaggi, eliminare messaggi ecc.

Finalmente la mia domanda. Come sarebbe meglio implementare questo grano più fine del controllo? Un approccio che vedo (non sicuro se è buono), è semplicemente creare ruoli di appartenenza ASP.NET per tutto. Quindi potrei avere ....

Messenger (ampio ruolo di livello), createmessage, readmessage, EditMessage, DeLeteMessage.

Da una parte vorrei che alcuni utenti siano in grado di leggere / visualizzare i messaggi. Ma non necessariamente crearli o eliminarli. Le azioni dei singoli controller potrebbero avere i ruoli specifici applicati.

Vedi qualche problema con questo approccio? Hai un'idea migliore?

Soluzione finora

Ho deciso di creare il mio schema e implementare l'iscrizione personalizzata e i fornitori di ruoli. Il mio schema include;

    .
  • utente
  • userprofile
  • permesso
  • Permissionmentignment
  • ruolo
  • roleassignment

andando via per il giorno successivo o due ma aggiornerà con ulteriori informazioni quando ho una possibilità.

È stato utile?

Soluzione

Penso che dovresti dimenticare i ruoli sul meccanismo di autorizzazione, chiedere invece le autorizzazioni (alla fine un ruolo è un'agrupazione delle autorizzazioni), quindi se lo guardi in questo modo, il tuo attributo Authorize dovrebbe chiedere un'entità e un'azione , non per un ruolo particolare. Qualcosa come:

[Authorize(Entities.Message, Actions.Create)]
public ActionResult CreateMessage()

[Authorize(Entities.Message, Actions.Edit)]
public ActionResult EditMessage()

[Authorize(Entities.Message, Actions.View)]
public ActionResult ViewMessage()
.

In questo modo i tuoi ruoli fanno ciò che fanno meglio, la raccolta dei permessi astratti invece di determinare un modo inflessibile di livello di accesso.

Modifica: Per gestire regole specifiche come quella puntata da DAVID Robbins, Manager A non è consentita di eliminare messaggi creati da Gestore B, supponendo che entrambi abbiano il permesso richiesto di accedere a questa azione del controller, L'Autorize non è responsabile di controllare questo tipo di regole e anche se si tenta di verificare che al livello del filtro di azione sia un dolore, quindi ciò che puoi fare è estendere la convalida dell'autorità (iniettando un parametro di azione che tiene il parametro Risultato di convalida), e lasciare che l'AzioneRESULT renda la decisione logica lì con tutti gli argomenti in atto.

è un Domanda simile, non è esattamente il caso qui sottolineato qui, ma è un buon punto di partenza per estendere la convalida dell'autorizzazione con i parametri di azione.

Altri suggerimenti

Per quanto riguarda il tuo esempio crudo, non stai davvero parlando di autorizzazione, e l'autorizzazione sarebbe variabile tra i ruoli associativi "Manager" e "reporter"?Penso che sia necessario creare un meccanismo separato per quelle attività a grana più fini se i ruoli non distinguono tra un'autorizzazione di lettura e scrittura tra i messaggi.

Se dovessi creare un ruolo per ogni azione - EditMessage, DeLeteMessage - Cosa farai nel caso in cui Manager A non dovrebbe essere in grado di eliminare i messaggi per il gestore B?

Oltre ad aggiungere [Authorize(Roles="Administrator")] ecc. Sopra il tuo controller.Puoi anche Metti quell'attributo sulle azioni indivisive anche

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top