2009-08-19 13 views
14

Questo progetto su cui sto lavorando richiede di tenere un db locale degli utenti amministratori e utilizzare un db esterno per gli utenti regolari. A chiunque superi l'autenticazione nel file admin db dovrebbe essere assegnato il ruolo "admin" e a tutti gli utenti autenticati tramite l'altro db verrà sempre assegnato un ruolo "utente".Come imposto manualmente il ruolo di un utente in ASP.NET MVC?

Posso assegnare manualmente questi ruoli? Non ho bisogno della complessità di un Role Provider o altro, dal momento che sto usando solo questi due ruoli che saranno SEMPRE basati sul db con cui si autenticano.

Sarebbe un aiuto ENORME se fosse possibile fornire codice di esempio o un collegamento ad alcuni documenti. Grazie!

EDIT:

Attualmente non sto usando il provider di ruoli e creando uno sembra come una seccatura. So che non è "best practice", ma devo solo assegnare 1 dei 2 ruoli durante l'accesso (questo non cambierà mai). Inoltre, non ha senso memorizzare le informazioni sui ruoli nel database, poiché gli utenti sono già separati in 2 dbs dal loro ruolo.

Ecco alcuni pseudo-codice:

if (AdminDB.ValidateUser(username,password)==true) { 
    SetAuthCookie(username); 
    AssociateUserWithRole(username, 'admin'); 
} elseif (UserDB.ValidateUser(username,password)==true) { 
    SetAuthCookie(username); 
    AssociateUserWithRole(username, 'user'); 
} else { 
    // Login failed. 
} 

sua parte 'ThisSession.AssociateUserWithRole' non lo so. Fondamentalmente, l'utente è autenticato, ho bisogno di dire a quale ruolo appartiene l'utente.

risposta

15

Implementing a role provider non è particolarmente difficile, specialmente se si sta solo implementando il controllo dei ruoli, non la gestione dei ruoli. Attua semplicemente le porzioni di cui hai bisogno e fai riposare il resto NotImplementedExceptions. Se hai solo un'applicazione, non devi preoccuparti troppo di quella parte. Nota che le porzioni di cui hai bisogno saranno dettate dal modo in cui il framework lo usa, non da come lo useresti. Ad esempio, penso che sarà necessario implementare il bit che restituisce tutti i ruoli dell'utente anche se si desidera solo verificare se si trovano in un ruolo specifico.

Detto questo, è possibile omettere l'intero RoleProvider e fare il tutto nella sessione.In questo caso implementeresti il ​​tuo AuthorizeAttribute e sostituirai i suoi bit di autenticazione e controllo dei ruoli con i tuoi. Memorizza il ruolo dell'utente nella sessione una volta autenticato e controlla lì usando il tuo attributo e i parametri forniti all'attributo per il metodo/classe con cui lo hai decorato.

+0

L'autorizzazione personalizzata AuthorizeAttribute ha più senso per me (un .NET noob MVC da PHP-land). Grazie per l'aiuto!! –

+0

È la tua media usando 'Session' come questo ?: in login->' Session.Add ("LoggedInRole", "admin"); 'e quando ho bisogno del tipo di utente corrente, leggerlo da' Session'. 'Session' è abbastanza sicuro da salvare il tipo di utente (ruolo) in esso? –

+1

@MajidR 'Session' è in genere tutto sul lato server, quindi non è meno sicuro del provider di ruolo, da una prospettiva di intrusione. Ovviamente dovresti codificare tutta la logica da te così, da una prospettiva di robustezza, dipenderà. Probabilmente andrò sulla rotta 'RoleProvider'. – tvanfosson

6

Se si utilizza l'appartenenza & ruoli costruiti in asp.net poi guardare l'AddUserToRole e RemoveUserFromRole:

http://msdn.microsoft.com/en-us/library/system.web.security.roles.addusertorole.aspx

in base a come LOGIN possibile aggiungere e rimuovere se necessario.

Non posso dire dal tuo post se non stai utilizzando il provider di ruolo o se stavi dicendo che non volevi creare il tuo fornitore di ruolo. Se non si utilizza il provider di ruolo incorporato, sarà necessario utilizzare qualsiasi meccanismo di codifica in atto per passare l'utente all'accesso in base a come/dove effettuano l'accesso.

MODIFICA: Ora che hai mostrato il tuo codice e hai dichiarato che non stai utilizzando il motore dei ruoli di asp.net.

Si sta utilizzando il cookie dell'autenticazione moduli che appare, quindi sovrascrivere il authenticateRequest del file global.asax e impostare i ruoli come necessario e creare il ticket.

Ecco un esempio in: http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-roles-aspnet.html

Il campione unico "ottiene" i ruoli, ma è possibile aggiungere/modificare i ruoli qui.

+0

Penso @ soluzione tvanfosson avrebbe funzionato meglio per quello che mi serve. Grazie per l'aiuto! Lo apprezzo. –

2

Credo che questo articolo (anche se a partire dal 2003) descrive chiaramente il processo di assegnazione dei ruoli a un utente, e sostituendo il capitale su ogni richiesta (simile a quello che fa NerdDinner):

autorizzazione degli utenti con protezione basata sui ruoli : http://msdn.microsoft.com/en-us/library/aa289844%28v=vs.71%29.aspx

1

Se qualcuno incontra lo stesso problema con OWIN, immagino che questo può aiutare:

var identityResult = await manager.CreateIdentityAsync(login, "MyAppCookie"); 

if (<user is admin>) 
    identityResult.AddClaim(new System.Security.Claims.Claim(identityResult.RoleClaimType, "Admin")); 
else 
    identityResult.AddClaim(new System.Security.Claims.Claim(identityResult.RoleClaimType, "User")); 

HttpContext.Current.GetOwinContext().Authentication.SignIn(identityResult);