La funzione Gestione ruoli non è stata abilitata


192

Ottenuta la seguente ProviderException :

La funzione Gestione ruoli non è stata abilitata.

Fin qui tutto bene.

Esiste un metodo che può essere chiamato per verificare se il Role Manager è stato abilitato o meno?

Risposte:


302

Puoi farlo leggendo dalla proprietà booleana su:

System.Web.Security.Roles.Enabled

Questa è una lettura diretta dal enabledattributo roleManagerelemento nel web.config:

<configuration>
  <system.web>
    <roleManager enabled="true" />
  </system.web>
</configuration>


Aggiornamento:
per ulteriori informazioni, consulta questo esempio MSDN: https://msdn.microsoft.com/en-us/library/aa354509(v=vs.110).aspx


1
come posso fare questo dal codice anziché web.config? Ho provato a inserirlo Application_Starte diceThis method can only be called during the application's pre-start initialization phase.
Maslow

1
Dove va questo in web.config?
Matt Connolly,

17
Dopo aver aggiunto sopra a web.config roleManager è abilitato. Ma ora sto ricevendo un'eccezioneUnable to connect to SQL Server database
Irfan Yusanif il

2
@Infotekka Errore "Impossibile connettersi al database SQL Server".
Jack

2
wow, questa è un'ottima risposta, non devo nemmeno configurare nulla, funziona solo come un incantesimo. Una volta configurato in web.config, posso semplicemente controllare User.Identity.IsAuthenticated per vedere se un utente di login è autenticato. Così figo asp.net
Quan

52

Se sei arrivato qui perché stai usando il nuovo ASP.NET Identity UserManager, quello che stai effettivamente cercando è il RoleManager:

var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));

roleManager ti darà accesso per vedere se il ruolo esiste, creare, ecc., inoltre è stato creato per UserManager


73
Cosa c'entra il bambino di 3 anni con qualcosa? Sono stato portato a questo post da Google perché avevo a che fare con un problema durante la configurazione di Identity. Da quando l'ho capito ... la prossima persona che affronta lo stesso problema che viene portato qui da Google saprà cosa fare ...
Serj Sagan,

1
Inoltre, Identity UserManager ha una funzione utile per ottenere ruoli per l'utente specificato: UserManager.GetRolesAsync (User.Identity.GetUserId ());
keithl8041,

Dove metti var roleManager = new RoleManager <IdentityRole> (new RoleStore <IdentityRole> (new ApplicationDbContext ())); ?
Mario M,

Puoi farlo ovunque nell'app. Ovviamente dovrai risolvere alcuni riferimenti, ma ovunque tu abbia bisogno di ruoli in un'app Identity, puoi usare questa affermazione.
Serj Sagan,

11

Ho trovato 2 suggerimenti altrove su Google che hanno suggerito a) assicurandomi che la tua stringa di connessione db (quella che sta usando Roles) sia corretta e che la chiave sia scritta correttamente eb) che il flag Enabled su RoleManager sia impostato su true. Spero che uno di questi aiuti. Lo ha fatto per me.

Hai provato a controllare Roles.Enabled? Inoltre, puoi controllare Roles.Providers per vedere quanti provider sono disponibili e puoi controllare Roles.Provider per il provider predefinito. Se è nullo, non ce n'è uno.


Grazie per la risposta. Ma non è quello che voglio. Voglio un metodo che controlli se la funzione Gestione ruoli è abilitata o meno, senza memorizzare nella cache ProvenceException a tale scopo.
gsharp,

8

Ho trovato questa domanda a causa dell'eccezione menzionata. Il mio Web.Config non aveva alcun <roleManager>tag. Mi sono reso conto che anche se l'ho aggiunto (come suggerito da Infotekka ), è finito con un'eccezione del database. Dopo aver seguito i suggerimenti nelle altre risposte qui, nessuno ha risolto completamente il problema.

Poiché questi tag Web.Config possono essere generati automaticamente, non è stato corretto risolverli aggiungendoli manualmente. Se ti trovi in ​​un caso simile, annulla tutte le modifiche apportate a Web.Config e in Visual Studio:

  1. Premi Ctrl+ Q, digita nuget e fai clic su "Gestisci pacchetti NuGet";
  2. Premi Ctrl+ E, digita i provider e nell'elenco dovrebbe apparire " Librerie di base dei provider universali di Microsoft ASP.NET " e "Fornitori universali di ASP.NET di Microsoft per LocalDB " (entrambi creati da Microsoft);
  3. Fare clic sul pulsante Installa in entrambi e chiudere la finestra NuGet;
  4. Controlla il tuo Web.config e ora dovresti avere almeno un <providers>tag all'interno dei tag Profile , Membership , SessionState e anche all'interno del nuovo tag RoleManager , in questo modo:

    <roleManager defaultProvider="DefaultRoleProvider">
        <providers>
           <add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=NUMBER" connectionStringName="DefaultConnection" applicationName="/" />
        </providers>
    </roleManager>
  5. Aggiungi enabled="true"così:

    <roleManager defaultProvider="DefaultRoleProvider" enabled="true">
  6. Premi F6per compilare e ora dovrebbe essere OK procedere ad un aggiornamento del database senza quell'eccezione:

    1. Premere Ctrl+ Q, digitare manager , fare clic su "Console gestore pacchetti";
    2. Digita update-database -verbosee il metodo Seed funzionerà perfettamente (se non hai fatto casino altrove) e creerà alcune tabelle nel tuo Database;
    3. Premi Ctrl+ W+ Lper aprire Esplora server e dovresti essere in grado di controllare in Connessioni dati> DefaultConnection> Tabelle le tabelle Ruoli e UsersInRoles tra le tabelle appena create!

1
" Poiché i campi Web.Config vengono generati automaticamente " Questo non è del tutto corretto. Mentre molti pacchetti NuGet regolano automaticamente i file di configurazione, non esiste una regola impostata che li richieda.
Kevin R.

Questo è perfetto. Thnx
sapatelbaps

6

Se lo stai usando ASP.NET Identity UserManagerpuoi ottenerlo anche in questo modo:

var userManager = Request.GetOwinContext().GetUserManager<ApplicationUserManager>();

var roles = userManager.GetRoles(User.Identity.GetUserId());

Se hai modificato la chiave per l'utente da Guid a Int, ad esempio, utilizza questo codice:

var roles = userManager.GetRoles(User.Identity.GetUserId<int>());

Questo ha funzionato per me. Si prega di dire perché se si vota verso il basso.
Ogglas,

questo non funziona perché è necessario trasmettere userid in int in modo tale che: userManager.GetRoles (Convert.ToInt32 (User.Identity.GetUserId <int> ()));
giocattolo

@toy No, <int> otterrà il valore come int. Non c'è bisogno di convertire. Naturalmente, affinché funzioni, la chiave di identità deve essere int.
Ogglas,

-1
<roleManager
  enabled="true"
  cacheRolesInCookie="false"
  cookieName=".ASPXROLES"
  cookieTimeout="30"
  cookiePath="/"
  cookieRequireSSL="false"
  cookieSlidingExpiration="true"
  cookieProtection="All"
  defaultProvider="AspNetSqlRoleProvider"
  createPersistentCookie="false"
  maxCachedResults="25">
  <providers>
    <clear />
    <add
       connectionStringName="MembershipConnection"
       applicationName="Mvc3"
       name="AspNetSqlRoleProvider"
       type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    <add
       applicationName="Mvc3"
       name="AspNetWindowsTokenRoleProvider"
       type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </providers>
</roleManager>

-1

Ecco il codice che devi inserire nel tuo Controller account in MVC5 e versioni successive per ottenere l'elenco dei ruoli di un utente:

csharp public async Task<ActionResult> RoleAdd(string UserID) { return View(await UserManager.GetRolesAsync(UserID)).OrderBy(s => s).ToList()); }

Non è necessario utilizzare Roles.GetRolesForUser()e abilitare la funzione Gestione ruoli.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.