La fonctionnalité Gestionnaire de rôles n'a pas été activée

194

Vous avez le ProviderException suivant :

La fonctionnalité Gestionnaire de rôles n'a pas été activée.

Jusqu'ici tout va bien.

Existe-t-il quelque part une méthode qui peut être appelée pour vérifier si le gestionnaire de rôles a été activé ou non?

gsharp
la source

Réponses:

304

Vous pouvez le faire en lisant la propriété booléenne à l'adresse:

System.Web.Security.Roles.Enabled

Il s'agit d'une lecture directe de l' enabledattribut de l' roleManagerélément dans web.config:

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


Mise à jour:
pour plus d'informations, consultez cet exemple MSDN: https://msdn.microsoft.com/en-us/library/aa354509(v=vs.110).aspx

Infotekka
la source
1
comment puis-je faire cela à partir du code au lieu de web.config? J'ai essayé de le mettre Application_Startet il ditThis method can only be called during the application's pre-start initialization phase.
Maslow
1
Où cela va-t-il dans web.config?
Matt Connolly
17
Après avoir ajouté ci-dessus à web.config roleManager est activé. Mais maintenant, je reçois une exceptionUnable to connect to SQL Server database
Irfan Yusanif
2
@Infotekka "Impossible de se connecter à la base de données SQL Server".
Jack le
2
wow, c'est une excellente réponse, je n'ai même pas besoin de configurer quoi que ce soit, fonctionne juste comme un charme. Une fois configuré dans web.config, je peux simplement vérifier User.Identity.IsAuthenticated pour voir si un utilisateur de connexion est authentifié. So cool asp.net
Quan
52

Si vous êtes arrivé ici parce que vous utilisez le nouveau ASP.NET Identity UserManager, ce que vous recherchez est RoleManager:

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

roleManager vous donnera accès pour voir si le rôle existe, créer, etc., plus il est créé pour le UserManager

Serj Sagan
la source
73
Qu'est-ce que l'enfant de 3 ans a à voir avec quoi que ce soit? J'ai été redirigé vers ce post de Google parce que j'étais confronté à un problème de configuration d'identité. Depuis que je l'ai compris ... la prochaine personne confrontée au même problème que moi qui sera amenée ici par Google saura quoi faire ...
Serj Sagan
1
En outre, Identity UserManager a une fonction utile pour obtenir des rôles pour l'utilisateur donné: UserManager.GetRolesAsync (User.Identity.GetUserId ());
keithl8041
Où mettez-vous var roleManager = new RoleManager <IdentityRole> (new RoleStore <IdentityRole> (new ApplicationDbContext ())); ?
Mario M
Vous pouvez le faire n'importe où dans l'application. Vous devrez évidemment résoudre certaines références, mais partout où vous avez besoin de rôles dans une application d'identité, vous pouvez utiliser cette instruction.
Serj Sagan
11

J'ai trouvé 2 suggestions ailleurs via Google qui suggéraient a) de s'assurer que votre chaîne de connexion db (celle que Roles utilise) est correcte et que la clé est correctement orthographiée, et b) que l'indicateur Activé sur RoleManager est défini sur true. J'espère que l'une de ces aides. Ça l'a fait pour moi.

Avez-vous essayé de vérifier Roles.Enabled? Vous pouvez également vérifier Roles.Providers pour voir combien de fournisseurs sont disponibles et vous pouvez vérifier Roles.Provider pour le fournisseur par défaut. S'il est nul, il n'y en a pas.

Newclique
la source
Merci pour votre réponse. Mais ce n'est pas ce que je veux. Je veux une méthode qui vérifie si la fonctionnalité Role Manager est activée ou non, sans mettre en cache ProviderException à cette fin.
gsharp
8

J'ai trouvé cette question en raison de l'exception qui y est mentionnée. Mon Web.Config n'avait aucune <roleManager>balise. J'ai réalisé que même si je l'ai ajouté (comme le suggérait Infotekka ), il se retrouvait dans une exception de base de données. Après avoir suivi les suggestions des autres réponses ici, aucune n'a complètement résolu le problème.

Étant donné que ces balises Web.Config peuvent être générées automatiquement, il n'a pas été judicieux de les résoudre en les ajoutant manuellement. Si vous êtes dans un cas similaire, annulez toutes les modifications que vous avez apportées à Web.Config et dans Visual Studio:

  1. Appuyez sur Ctrl+ Q, tapez nuget et cliquez sur "Gérer les packages NuGet";
  2. Appuyez sur Ctrl+ E, tapez les fournisseurs et dans la liste, il devrait apparaître "Microsoft ASP.NET Universal Providers Core Libraries " et "Microsoft ASP.NET Universal Providers for LocalDB " (tous deux créés par Microsoft);
  3. Cliquez sur le bouton Installer dans les deux et fermez la fenêtre NuGet;
  4. Vérifiez votre Web.config et vous devriez maintenant avoir au moins une <providers>balise à l'intérieur des balises Profile , Membership , SessionState et également à l'intérieur de la nouvelle balise RoleManager , comme ceci:

    <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. Ajoutez enabled="true"comme ceci:

    <roleManager defaultProvider="DefaultRoleProvider" enabled="true">
    
  6. Appuyez sur F6pour construire et maintenant il devrait être OK pour procéder à une mise à jour de la base de données sans avoir cette exception:

    1. Appuyez sur Ctrl+ Q, tapez manager , cliquez sur "Package Manager Console";
    2. Tapez update-database -verboseet la méthode Seed fonctionnera très bien (si vous n'avez pas joué ailleurs) et créez quelques tables dans votre base de données;
    3. Appuyez sur Ctrl+ W+ Lpour ouvrir l'Explorateur de serveurs et vous devriez pouvoir vérifier dans Connexions de données> DefaultConnection> Tables les tables Roles et UsersInRoles parmi les tables nouvellement créées!
CPHPython
la source
1
" Les champs Web.Config étant générés automatiquement " Ce n'est pas tout à fait correct. Alors que de nombreux packages NuGet ajusteront automatiquement les fichiers de configuration, aucune règle définie ne les oblige à le faire.
Kevin R.
C'est parfait. Thnx
sapatelbaps
6

Si vous utilisez, ASP.NET Identity UserManagervous pouvez également l'obtenir comme ceci:

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

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

Si vous avez changé la clé pour l'utilisateur de Guid à Int par exemple, utilisez ce code:

var roles = userManager.GetRoles(User.Identity.GetUserId<int>());
Ogglas
la source
Cela a fonctionné pour moi. Veuillez dire pourquoi si vous votez contre.
Ogglas
cela ne fonctionne pas car vous devez convertir userid en int de telle sorte que: userManager.GetRoles (Convert.ToInt32 (User.Identity.GetUserId <int> ()));
jouet du
@toy Non, <int> obtiendra la valeur comme int. Pas besoin de convertir. Bien sûr, pour que cela fonctionne, la clé d'identité doit être 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>
Michael Goldshmidt
la source
-1

Voici le code que vous devez mettre dans votre contrôleur de compte dans MVC5 et versions ultérieures pour obtenir la liste des rôles d'un utilisateur:

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

Il n'est pas nécessaire d'utiliser Roles.GetRolesForUser()et d'activer la fonction Role Manager.

Amneu
la source