La función Administrador de roles no se ha habilitado

192

Obtuve la siguiente excepción de proveedor :

La función Administrador de roles no se ha habilitado.

Hasta aquí todo bien.

¿Existe algún método al que se pueda llamar para verificar si Role Manager se ha habilitado o no?

gsharp
fuente

Respuestas:

302

Puede hacerlo leyendo la propiedad booleana en:

System.Web.Security.Roles.Enabled

Esta es una lectura directa del enabledatributo del roleManagerelemento en web.config:

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


Actualización:
para obtener más información, consulte esta muestra de MSDN: https://msdn.microsoft.com/en-us/library/aa354509(v=vs.110).aspx

Infotekka
fuente
1
¿Cómo puedo hacer esto desde el código en lugar de web.config? Traté de ponerlo Application_Starty diceThis method can only be called during the application's pre-start initialization phase.
Maslow
1
¿A dónde va esto en web.config?
Matt Connolly
17
Después de agregar arriba a web.config roleManager está habilitado. Pero ahora recibo una excepciónUnable to connect to SQL Server database
Irfan Yusanif el
2
@Infotekka Error "No se puede conectar a la base de datos de SQL Server".
Jack
2
wow, esta es una gran respuesta, ni siquiera tengo que configurar nada, solo funciona a las mil maravillas. Una vez configurado en web.config, puedo verificar User.Identity.IsAuthenticated para ver si un usuario de inicio de sesión está autenticado. Tan genial asp.net
Quan
52

Si llegaste aquí porque estás usando lo nuevo ASP.NET Identity UserManager, lo que realmente estás buscando es RoleManager:

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

roleManager le dará acceso para ver si el rol existe, crear, etc., además se crea para el UserManager

Serj Sagan
fuente
73
¿Qué tiene que ver el niño de 3 años con algo? Me llevaron a esta publicación de Google porque estaba lidiando con un problema al configurar Identity. Desde que lo descubrí ... la próxima persona que lidie con el mismo problema que yo, que fue traído aquí por Google, sabrá qué hacer ...
Serj Sagan
1
Además, Identity UserManager tiene una característica útil para obtener roles para el usuario dado: UserManager.GetRolesAsync (User.Identity.GetUserId ());
keithl8041
¿Dónde colocas var roleManager = new RoleManager <IdentityRole> (new RoleStore <IdentityRole> (new ApplicationDbContext ())); ?
Mario M
Puedes hacerlo en cualquier lugar de la aplicación. Obviamente, deberá resolver algunas referencias, pero en cualquier lugar donde necesite roles en una aplicación de Identidad, puede usar esta declaración.
Serj Sagan
11

Encontré 2 sugerencias en otro lugar a través de Google que sugerían a) asegurarse de que su cadena de conexiones db (la que Roles está usando) es correcta y que la clave está escrita correctamente, yb) que el indicador Habilitado en RoleManager está establecido en verdadero. Espero que una de esas ayudas. Lo hizo por mi.

¿Intentaste comprobar Roles.Enabled? Además, puede verificar Roles.Providers para ver cuántos proveedores están disponibles y puede verificar Roles.Provider para el proveedor predeterminado. Si es nulo, entonces no hay ninguno.

Newclique
fuente
Gracias por tu respuesta. Pero no es lo que quiero. Quiero un método que verifique si la función Role Manager está habilitada o no, sin almacenar en caché ProviderException para ese propósito.
gsharp
8

Encontré esta pregunta debido a la excepción mencionada en ella. Mi Web.Config no tenía ninguna <roleManager>etiqueta. Me di cuenta de que incluso si lo agregué (como sugirió Infotekka ), terminó en una excepción de base de datos. Después de seguir las sugerencias en las otras respuestas aquí, ninguno resolvió completamente el problema.

Dado que estas etiquetas Web.Config se pueden generar automáticamente, se sintió mal resolverlas agregándolas manualmente. Si se encuentra en un caso similar, deshaga todos los cambios que realizó en Web.Config y en Visual Studio:

  1. Presione Ctrl+ Q, escriba nuget y haga clic en "Administrar paquetes NuGet";
  2. Presione Ctrl+ E, escriba proveedores y en la lista debería aparecer " Bibliotecas principales de proveedores universales de Microsoft ASP.NET " y "Proveedores universales de Microsoft ASP.NET para LocalDB " (ambos creados por Microsoft);
  3. Haga clic en el botón Instalar en ambos y cierre la ventana NuGet;
  4. Verifique su Web.config y ahora debe tener al menos una <providers>etiqueta dentro de las etiquetas Perfil , Membresía , Estado de sesión y también dentro de la nueva etiqueta RoleManager , como esta:

    <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. Añadir enabled="true"así:

    <roleManager defaultProvider="DefaultRoleProvider" enabled="true">
  6. prensa F6 para construir y ahora debería estar bien continuar con una actualización de la base de datos sin tener esa excepción:

    1. Presione Ctrl+ Q, escriba manager , haga clic en "Package Manager Console";
    2. Tipo update-database -verbose y el método de Seed funcionarán bien (si no has jugado en otro lugar) y crearán algunas tablas en tu Base de Datos;
    3. ¡Presione Ctrl+ W+ Lpara abrir el Explorador de servidores y debería poder verificar Conexiones de datos> Conexión predeterminada> Tablas de las tablas Roles y UsersInRoles entre las tablas recién creadas!
CPHPython
fuente
1
" Dado que los campos Web.Config se generan automáticamente " Esto no es del todo correcto. Si bien muchos paquetes de NuGet ajustarán automáticamente los archivos de configuración, no existe una regla establecida que lo requiera.
Kevin R.
Esto es perfecto. Thnx
sapatelbaps
6

Si está utilizando ASP.NET Identity UserManager, puede obtenerlo así también:

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

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

Si ha cambiado la clave para el usuario de Guid a Int, por ejemplo, use este código:

var roles = userManager.GetRoles(User.Identity.GetUserId<int>());
Ogglas
fuente
Esto funcionó para mí. Diga por qué si está votando en contra.
Ogglas
esto no funciona porque necesita convertir userid a int de modo que: userManager.GetRoles (Convert.ToInt32 (User.Identity.GetUserId <int> ()));
juguete
@toy No, <int> obtendrá el valor como int. No hay necesidad de convertir. Por supuesto, para que esto funcione, la clave de identidad debe ser 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
fuente
-1

Aquí está el código que debe poner en su controlador de cuenta en MVC5 y más adelante para obtener la lista de roles de un usuario:

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

No hay necesidad de usar Roles.GetRolesForUser()y habilitar la función Role Manager.

Amneu
fuente