2012-04-27 12 views
12

Nella nostra rete aziendale, i ruoli in Active Directory (AD) non sono assegnati in modo appropriato per la mia applicazione. Così ho creato una semplice tabella nel mio database per mappare tutti gli utenti nell'AD e i loro ruoli. Ci sono letteralmente solo due colonne in questa tabella, utente e ruolo.Semplici ruoli personalizzati per l'autenticazione di Windows in asp. netto?

Spero di sfruttare la potente gestione dei ruoli in asp.net, voglio utilizzare funzionalità come [Authorize(Roles = "Managers")]. esiste un modo semplice per utilizzare questi ruoli personalizzati senza impostare ruoli complicati e provider di appartenenze?

applicazione in background: sql server, LINQ, asp.net mvc

risposta

11

E 'davvero facile da implementare provider di ruoli personalizzati. Fondamentalmente è necessario implementare due funzioni.

un'occhiata a questo articolo: Custom Role Provider for MVC

+0

esattamente quello che mi serve, grazie! – Bonk

+7

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento.Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. – Fedor

2

Article provided in the event the website goes down.

personalizzato provider di ruoli per MVC

In un precedente articolo, ho spiegato come creare personalizzato provider di appartenenze per autorizzare l'utente e proteggere i controlli e pagine. Ma cosa succede se vuoi mostrare o proteggere un'area, un controller o una pagina per un gruppo specifico di utenti? Ad esempio, consentire l'accesso al Pannello di amministrazione solo per gli amministratori.

In .Net Framework per questo scopo è il fornitore di ruolo. Ma di nuovo, usa il proprio DB per i ruoli degli utenti del negozio. Creiamo e configuriamo il fornitore di ruolo personalizzato che utilizzerà il nostro DB o qualsiasi altra memoria. Come prima dobbiamo sovrascrivere classe da NET:

enter image description here

enter image description here

enter image description here

Per la funzionalità minima, abbiamo bisogno di implementare e sovrascrivere due funzioni GetRolesForUser e IsUserInRole. In primo luogo, uno viene utilizzato per ottenere un elenco di tutti i ruoli utente (o gruppi):

public override string[] GetRolesForUser(string username) 
{ 
    using (DatabaseEntities db = new DatabaseEntities()) 
    { 
     User user = db.Users.FirstOrDefault(u => u.UserName.Equals(username, StringComparison.CurrentCultureIgnoreCase) || u.Email.Equals(username, StringComparison.CurrentCultureIgnoreCase)); 

     var roles = from ur in user.UserRoles 
        from r in db.Roles 
        where ur.RoleId == r.Id 
        select r.Name; 
     if (roles != null) 
      return roles.ToArray(); 
     else 
      return new string[] {}; ; 
    } 
} 

Come potete vedere ho individuare l'utente nel mio DB con il parametro nome utente della funzione (nel mio caso è può essere il nome utente o email) e creare la lista di stringhe dei ruoli utente.

seconda funzione è quello di verificare se l'utente nel ruolo (o gruppo):

public override bool IsUserInRole(string username, string roleName) 
{ 
    using (DatabaseEntities db = new DatabaseEntities()) 
    { 
     User user = db.Users.FirstOrDefault(u => u.UserName.Equals(username, StringComparison.CurrentCultureIgnoreCase) || u.Email.Equals(username, StringComparison.CurrentCultureIgnoreCase)); 

     var roles = from ur in user.UserRoles 
        from r in db.Roles 
        where ur.RoleId == r.Id 
        select r.Name; 
     if (user != null) 
      return roles.Any(r => r.Equals(roleName, StringComparison.CurrentCultureIgnoreCase)); 
     else 
      return false; 
    } 
} 

allora abbiamo bisogno di configurare in soluzione file web.config di utilizzare provider di ruoli creati. Potrebbe essere necessario impostare cacheRolesInCookie su false per scopi di debug o il comportamento sarà imprevedibile.

<system.web> 
    <compilation debug="true" targetFramework="4.5.2" /> 
    <httpRuntime targetFramework="4.5.2" /> 
    <authentication mode="Windows" /> 
    <authorization> 
     <deny users="?" /> 
    </authorization> 
    <roleManager cacheRolesInCookie="true" defaultProvider="KitsulaRoleProvider" enabled="true"> 
     <providers> 
      <clear /> 
      <add name="KitsulaRoleProvider" type="Kitsula.Security.KitsulaRoleProvider" /> 
     </providers> 
    </roleManager> 
</system.web> 

Ora è possibile proteggere i controller, le azioni, le pagine per un gruppo specifico di utenti che si trovano in ruoli specificati dal set Autorizzare attributo:

using System; 
using System.Web.Mvc; 

namespace Kitsula.Areas.Admin.Controllers 
{ 
    [Authorize(Roles = "Administrators")] 
    public class HomeController : Controller 
    { 
     // 
     // GET: /Admin/Home/ 

     public ActionResult Index() 
     { 
      return View(); 
     } 

    } 
} 
Problemi correlati