none
Problema con identity y role provider RRS feed

  • Pregunta

  • Hola, tengo un problema con una app mvc5, uso el identity y de principio al tratar de mostrar los roles de un usuario, me salto el siguiente error:

    • La característica Administrador de funciones no está habilitada

    Después, en base a este link: 

    https://msdn.microsoft.com/es-es/library/system.web.security.roles(v=vs.100).aspx

    realicé un cambio añadiendo este codigo en mi web.config:

    <roleManager defaultProvider="SqlProvider" 
        enabled="true"
        cacheRolesInCookie="true"
        cookieName=".ASPROLES"
        cookieTimeout="30"
        cookiePath="/"
        cookieRequireSSL="false"
        cookieSlidingExpiration="true"
        cookieProtection="All" >
        <providers>
          <clear />
          <add
            name="SqlProvider"
            type="System.Web.Security.SqlRoleProvider"
            connectionStringName="UsuariosPortafolio"
            applicationName="PortafolioWeb" />
          </providers>
        </roleManager>

    y ahora el error es este:


    No se me ocurre por que salta el error

    Les agradezco de antemano.

    Saludos cordiales

    lunes, 13 de abril de 2015 20:57

Respuestas

  • Si te salta el error de "Referencia no establecida..." en la linea

    Modelo.Rol = Roles.GetRolesForUser(Modelo.Email).First()

    puede ser por dos razones:

    1) Modelo es null. Habría que ver qué es tu variable "Modelo" y dónde la inicializas, pero si llegase como null hasta esa sentencia que te da el error indicaría un error en la lógica del programa, ya que has tratado de usar la variable antes de inicializarla.

    2) Roles.GetRolesForUser(...) devuelve null. Esto depende de la implementación interna de GetRolesForUser. ¿Qué pasa si ese usuario no tiene roles, o no existe en el sistema de Membership)? ¿GetRolesForUser devuelve null o devuelve una lista con cero elementos? En el primer caso, te dará un error de "referencia no establecida" al llamar a .First. En el segundo caso, First dará un error diciendo que no tiene elementos. Como no se sabe cuál de las dos cosas va a pasar, tu programa debe tener sendos "if" para contemplar ambas posibilidades y que no se produzca un error.

    martes, 14 de abril de 2015 5:42
  • me da a mi que estás confundiendo cosas. El método que tu usas es de membership estándar no de asp.net Identity. Para el manejo de roles Identity usa el RoleManager.

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    miércoles, 15 de abril de 2015 18:46
    Moderador

Todas las respuestas

  • Si te salta el error de "Referencia no establecida..." en la linea

    Modelo.Rol = Roles.GetRolesForUser(Modelo.Email).First()

    puede ser por dos razones:

    1) Modelo es null. Habría que ver qué es tu variable "Modelo" y dónde la inicializas, pero si llegase como null hasta esa sentencia que te da el error indicaría un error en la lógica del programa, ya que has tratado de usar la variable antes de inicializarla.

    2) Roles.GetRolesForUser(...) devuelve null. Esto depende de la implementación interna de GetRolesForUser. ¿Qué pasa si ese usuario no tiene roles, o no existe en el sistema de Membership)? ¿GetRolesForUser devuelve null o devuelve una lista con cero elementos? En el primer caso, te dará un error de "referencia no establecida" al llamar a .First. En el segundo caso, First dará un error diciendo que no tiene elementos. Como no se sabe cuál de las dos cosas va a pasar, tu programa debe tener sendos "if" para contemplar ambas posibilidades y que no se produzca un error.

    martes, 14 de abril de 2015 5:42
  • Hola Alberto, gracias por responder.

    este es mi codigo en el modelo:

     public class ModeloCuentaParcial
        {
            public string Email { get; set; }
            public string Rol { get; set; }
            public string Bloqueado { get; set; }
    
            public ModeloCuentaParcial() { }
            public ModeloCuentaParcial(string id)
            {
                UsuariosPortafolio ctx = new UsuariosPortafolio();
               
                Usuario usuario = ctx.Users.Find(id);
                this.Email = usuario.Email;
                this.Rol = Roles.GetRolesForUser(usuario.Email).First();
                this.Bloqueado = usuario.Bloqueado ? "Si" : "No";
            }
        }

    este en el controlador:

     public ActionResult CuentaParcial(string id)
            {
    
                ModeloCuentaParcial Modelo = new ModeloCuentaParcial(id);
    
                return PartialView(Modelo);
            }

    Como veras es muy simple, ya revisé que exista al menos 1 rol, y al menos un usuario asociado a ese rol, pero el error persiste:

    martes, 14 de abril de 2015 17:27
  • pon un punto de ruptura en la,linea que se indica en rojo. El objeto usuario es nulo? No veo que controles si la búsqueda por id te devuelve un usuario....

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    martes, 14 de abril de 2015 19:07
    Moderador
  • Hola Sergio, gracias por responder. Si se carga un usuario, de hecho las propiedades Email y Bloqueado se cargan con los datos esperados, el problema solo esta en la linea de la propiedad Rol.
    • Editado Richof martes, 14 de abril de 2015 19:41
    martes, 14 de abril de 2015 19:38
  • pero como identificas el usuario? No seria

     this.Rol = Roles.GetRolesForUser(id).First();

    o sea, buscar por id


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 14 de abril de 2015 19:46
    Moderador
  • No, en realidad ese método recibe el UserName como parámetro para listar los roles a los que va asociado el usuario, en mi caso es el username y el email son lo mismo.

    https://msdn.microsoft.com/en-us/library/8h930x07(v=vs.110).aspx

    martes, 14 de abril de 2015 19:57
  • si ejecutas Roles.GetRolesForUser(usuario.Email) en Immediato... Que obtienes? O inclusive en el Inspeccionar puedes ponerlo. Recuerda porner el punto ruptura en dicha linea roja

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 14 de abril de 2015 20:04
    Moderador
  • Gracias por el consejo Sergio. Alguna otra idea? aun no lo he resuelto...
    • Editado Richof miércoles, 15 de abril de 2015 13:03
    martes, 14 de abril de 2015 22:47
  • Buenos dias....

    alguien tiene idea por qué al tratar de usar los métodos de la clase Roles de System.Web.Security

    me sale el error:

    Could not find stored procedure 'dbo.aspnet_CheckSchemaVersion'

    pensé que esa tabla era del antiguo membership

    agradezco  de antemano cualquier colaboración

    Saludos

    miércoles, 15 de abril de 2015 15:45
  • Qué sistema de Membership estás empleando? SimpleMembership o el Membership estandar?


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    miércoles, 15 de abril de 2015 15:50
    Moderador
  • Gracias por el consejo Sergio. Alguna otra idea? aun no lo he resuelto...

    En mi ultima respuesta del otro día te comenté si el resultado de la llamada a Roles.GetRolesForUser() es null

    He visto que usar como roleProvider esta cadena de conexion

     connectionStringName="UsuariosPortafolio"

    Has verificado dicha cadena?? En la bbdd que apunta tienes los datos correctos?


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    miércoles, 15 de abril de 2015 15:52
    Moderador
  • si, esta es la cadena

    <add name="UsuariosPortafolio" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\UsuariosPortafolio.mdf;Initial Catalog=UsuariosPortafolio;Integrated Security=True"
          providerName="System.Data.SqlClient" />

    y funciona bien para registrar los usuarios y para el login.

    Me extraña que busque este procedimiento almacenado:

     stored procedure 'dbo.aspnet_CheckSchemaVersion'

    • Editado Richof miércoles, 15 de abril de 2015 16:07
    miércoles, 15 de abril de 2015 16:06
  • otra pregunta.. Esa bbdd como la creaste? Ejecutando aspnet_regsql??


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    miércoles, 15 de abril de 2015 16:16
    Moderador
  • te comento que con el membership estándar tienes varias tablas. Unas que corresponden con el Membership que son los usuarios, otra que es Profile para almacenar los perfiles y otra de Roles. Has creado tu bbdd con al menos Membership y Roles?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    miércoles, 15 de abril de 2015 16:23
    Moderador
  • Lo de la bbdd que te comento lo puedes ver en https://msdn.microsoft.com/es-es/library/system.web.security.sqlroleprovider%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    miércoles, 15 de abril de 2015 16:30
    Moderador
  • Bueno Identity utiliza otro esquema de base de datos

    http://www.asp.net/identity/overview/getting-started/introduction-to-aspnet-identity

    por eso me llama la atención que se siga buscando un procedimiento almacenado del antiguo membership provider

    miércoles, 15 de abril de 2015 18:03
  • me da a mi que estás confundiendo cosas. El método que tu usas es de membership estándar no de asp.net Identity. Para el manejo de roles Identity usa el RoleManager.

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    miércoles, 15 de abril de 2015 18:46
    Moderador