Domanda

sto sistema che utilizza l'accesso in base al ruolo diversi metodi nelle classi di attuazione. Ad esempio, per eseguire qualsiasi azione Devo controllare se l'utente che lo usa può farlo.

posso scrivere in ogni metodo:

if(User.IsInRole ...) {
} else {
return ... throw ... whatever
}

I stava pensando di automatizzare questo processo, ad esempio con l'aggiunta di attributi di questo metodi o forse qualsiasi altra soluzione?

È stato utile?

Soluzione

Date un'occhiata a 'Aspect Oriented Programming' (AOP) biblioteche - e le risposte a questa domanda StackOverflow. È possibile utilizzare AOP per aggiungere il codice di controllo ruolo automaticamente.

Altri suggerimenti

Fino a quando si utilizza mandanti cose sono già lì ...

[PrincipalPermission(SecurityAction.Demand, Role = "A role available on your principal")]
public void Foo()
{
  // Will throw an exception if the principal does not have the required role
  // Otherwise the method will execute normally
}

Do il controllo una volta in fase di costruzione, e un tiro (o NULL ritorno dalla fabbrica) se la condizione di sicurezza non è soddisfatta. Successivamente, in possesso di un riferimento ad un dato oggetto modello è una prova sufficiente che hai superato il controllo di sicurezza a un certo punto in precedenza. Se siete preoccupati che questo potrebbe causare TOCTTOU problemi, in modo che questi oggetti diventano inutilizzabili al termine di un concetto definito dall'applicazione di "turno di gioco" (tipicamente la transazione del database); questa è una buona pratica in ogni caso.

Questo approccio di sicurezza è chiamato disciplina capacità . Pensa ai tuoi oggetti come caselle che hanno qualche autorità al loro interno (nelle loro variabili private). Premendo i tasti sulla scatola, si può esercitare solo una frazione su misura verso il basso di questa autorità nei modi che il programmatore dell'oggetto che si permette di.

Per esempio, diciamo che si sta scrivendo un'applicazione di calendario con un back-end SQL. V'è l'oggetto SQLTransaction, che non sopravviverà l'operazione (di cui al precedente), ma ancora ha tutti i diritti per tutte le tabelle che utilizza l'applicazione. Questo è un sacco di potere che non si desidera essere passando intorno a utenti di un API (in modo esplicito o per errore, pensare SQL injection). Invece che la mano fuori oggetti User quel modello l'autorità di scrivere solo per riga dell'utente nella tabella Utenti; anche una User in grado di creare, leggere, aggiornare, oggetti Appointment di eliminazione, che allo stesso modo rappresentano l'autorità limitata nella tabella Appuntamenti.

Per mantenere RBAC per tutta l'API, è necessario assicurarsi che il seguente attesa:

  1. Solo gli utenti legittimi possono ottenere l'accesso all'oggetto User che li rappresenta. Questo è dove eseguire il cablaggio del sistema di autenticazione nel costruttore User;
  2. Gli oggetti User non perdita di autorità , cioè si deve controllare la vostra API per fare in modo che esercitando chiamate di metodo su un User (o qualsiasi oggetto correlato ritornano, ricorsivamente) non è possibile leggere o modificare qualsiasi risorsa che non appartengono a questo utente. Questo è dove si può applicare la sfaccettatura modello - ad esempio User.GetAppointments() rendimenti casi reali Appointment per gli appuntamenti creati da questo utente, ma di sola lettura wrapper per quelli creati da qualcun altro.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top