2014-12-22 34 views
7

Attualmente stiamo lavorando su un'applicazione ASP.NET MVC 5 più piccola utilizzando l'identità ASP.NET. Ci consente di mantenere diversi progetti e le loro attività. Abbiamo recentemente implementato l'autenticazione di base, quindi siamo in grado di registrare un utente con il nostro sito e accedere con loro.Diritti di implementazione con identità ASP.NET

Vogliamo essere in grado di gestire i diritti di accesso sulla base del progetto in modo che possiamo dire per ogni singolo utente che ha letto, scrivere, amministrare o non autorizzazioni per un progetto specificato.

Il mio primo pensiero è stato che possiamo creare una nuova tabella semplice nel nostro database che memorizza i diritti dell'utente. Ma penso che ci possa essere un modo integrato per raggiungere questo obiettivo con l'identità di ASP.NET.

Quindi la mia domanda è davvero, quale percorso dovremmo seguire: creare manualmente una nuova tabella per amministrare i diritti o utilizzare qualcosa di built-in fornito da ASP.NET Identity.

+0

Forse questo articolo ti aiuterà a prendere una decisione: http://brockallen.com/2013/10/20/the-good-the-bad-and-the-ugly-of-asp-net-identity/ –

+0

Non esiste un concetto integrato di diritti utente nell'identità asp.net poiché sono un concetto molto specifico dell'applicazione. Esiste un concetto di ruoli utente, che è solo un raggruppamento logico di utenti. Di solito si applica un set di scritture utente specifiche a un ruolo. –

+0

Se ho capito bene, suggeriresti di creare un ruolo per ogni restrizione di accesso (lettura/scrittura/amministrazione) per ogni progetto? – Thorakas

risposta

3

uso qualcosa di built-in fornito da ASP.NET Identity

Le uniche cose che si potrebbero utilizzare ci sono rivendicazioni o ruoli ed entrambi non sono costruiti per ciò che si vuole IMO.

quindi vorrei andare con la propria tabella che collega il progetto a un utente, ad es .:

public class UserProjectRights 
{ 
    [Key] 
    public ApplicationUser User { get; set; } 
    [Key] 
    public Project Project { get; set; } 

    public AccessRight Right { get; set; } 
} 

Poi ogni volta che fate alcune azioni in cui è richiesto un diritto specifico è necessario controllare per questo. Ci sono diversi modi in cui puoi farlo. Nella mia app ho creato "accedere agli interni di controllo giusti" nel modo seguente (che ho definito un'interfaccia comune per tutti "l'accesso entità destra" a "riutilizzare" quel metodo):

public static bool? CanView(this ApplicationUser user, Project project) 
{ 
    var userRight = project.Rights.FirstOrDefault(r => r.User == user); 
    return userRight == null ? (bool?)null : userRight.Right.HasFlag(AccessRight.View); 
} 

assumendo AccessRight è un enum come:

[Flags] 
public enum AccessRight 
{ 
    View, 
    Edit, 
    Admin 
} 

allora si può fare qualcosa di simile a quanto segue nella logica:

if (user.CanView(project) == true) 
{ 
    // show project 
} 

ho usato bool? in modo da poter implementare diverso "Sottotito Comportamento "come so se viene restituito null non esiste un diritto definito.

+0

E quindi in ogni controller che fa qualcosa con qualche progetto o entità correlata al progetto, è necessario verificare se l'utente ha il diritto appropriato sul progetto (padre) dato. – CodeCaster

+0

'Le uniche cose che potresti usare sono affermazioni o ruoli e non sono entrambi costruiti per quello che vuoi IMO' - Ho usato abbastanza felicemente le affermazioni prima per fornire un comportamento" ruolo sul progetto "come descritto da OP. – Rawling

+1

@ChrFin quest'ultimo. Non sei proprio lì semplicemente creando un tavolo. Non che sia richiesto nella tua risposta, ma OP e futuri visitatori potrebbero essere confusi. – CodeCaster

Problemi correlati