Sicurezza a livello di tabella o riga in ASP.NET MVC 5 e Entity Framework 6

1

Ho già fatto questa domanda su Stack Overflow , ma nessuno ha risposto, quindi forse è un posto più appropriato per discuterne. Per favore fatemi sapere se ho torto e avere domande duplicate su reti diverse non è accettabile.

Utilizzo ASP.NET MVC 5, Entity Framework 6 e SQL Server 2008 per creare la mia applicazione web Intranet. Per questo progetto sono state assegnate due esigenze di sicurezza e non sono in grado di cambiarle.

  1. Gli accessi alle applicazioni nel database devono essere limitati dall'autorizzazione. Ricorda che è un'app Intranet e verrà installata sul server del cliente. Avranno il login al database ma ancora non vogliamo che siano in grado di fare casino. L'approccio suggerito per implementare questo requisito era quello di utilizzare gli accessi al database per l'autenticazione dell'app. In altre parole, ogni utente avrà i propri accessi al database. L'app non ha alcun accesso predefinito, quindi quando l'utente prova ad accedere all'app, il controller di autenticazione prova a utilizzare le credenziali di accesso per connettersi al database. In caso di successo, l'utente verrà autenticato nell'applicazione, altrimenti l'azione di accesso avrà esito negativo.

  2. Autorizzazione a livello di riga. Ogni utente e quindi l'accesso al database non avranno solo autorizzazioni limitate sulle tabelle ma anche sulle righe. Penso di poter implementare questa esigenza solo nell'app e di dimenticarmi del database.

Sono così confuso, qualsiasi guida ed esperienza personale su questi requisiti è la benvenuta. Penso di aver bisogno di un sistema di autenticazione che funzioni in questo modo e sia in grado di utilizzare gli accessi al database. Posso sovrascrivere MS Identity ? E cos'altro ha bisogno di questo progetto!?

    
posta Akbari 01.06.2015 - 09:51
fonte

2 risposte

1

Pubblicherò una soluzione alternativa a quella proposta in "Concessione delle autorizzazioni a livello di riga in SQL Server" di MSDN: link .

Nella mia soluzione, hai una meta tabella per ogni tabella in cui sono richieste le autorizzazioni a livello di riga. Mi piace chiamare questa tabella meta come tabella ACL (Access Control List). Quindi, ad esempio, la tabella di destinazione si chiama Contatti, quindi si crea un'altra chiamata alla tabella Contacts_ACL. Ora in quella tabella, inserisco Contact_Id, User_Id e Permission (o Permission_Id se disponiamo di una tabella delle autorizzazioni separata).

create table Contact (
    contact_id INT PRIMARY KEY,
    ...
);

create table Contact_ACL (
    contact_id INT REFERENCES Contact(contact_id),
    username varchar(100),
    permission varchar(20)
);

Lo faccio perché ritengo che Stored Procedure sia un eccesso di qualcosa che è molto semplice (autorizzazione). Implica inoltre la manutenzione del codice aggiuntivo poiché tutto ciò che si modifica la tabella di base, è necessario modificare le visualizzazioni e le stored procedure.

Ecco un esempio di LINQ Query per recuperare materiale:

from contact in Contact
join acl in Contact_ACL on contact.contact_id equals acl.contact_id
where acl.username == <username>
select new {
    contact.contact_id,
    ...,
    acl.permission
}
    
risposta data 05.06.2015 - 06:12
fonte
0

Hai bisogno di qualcosa chiamato mascheramento dinamico dei dati .

La società per cui lavoro, Axiomatics (disclaimer - lavoro per quella società), ha una soluzione basata su policy che consente il filtraggio e il mascheramento dei dati. Significa che in base a criteri e attributi, è possibile definire ciò che un utente può selezionare / INSERIRE / CANCELLARE ...

Il modo in cui funziona è la definizione di una politica, ad esempio:

  • Utente con il ruolo == dottore può eseguire l'azione == SELECT sulla tabella == MEDICALRECORD se e solo se userId == assegnatoDoctor.

Quindi, tra l'applicazione e il database, si distribuisce un proxy che intercetterà il flusso e aggiungerà l'istruzione del filtro SQL pertinente (tipicamente una clausola WHERE) ad esempio:

  • SQL intercettato: SELECT * FROM medicalrecords
  • Clausola WHERE generata: WHERE medicalrecords.assignedDoctor='Alice'
  • Istruzione SQL finale inviata al db: SELECT * FROM medicalrecords WHERE medicalrecords.assignedDoctor='Alice'

Le norme sono in un formato standard chiamato e abilita attributo- controllo di accesso basato (noto anche come ).

I seguenti collegamenti potrebbero esserti utili:

risposta data 01.06.2015 - 16:37
fonte

Leggi altre domande sui tag