RoleProvider no funciona con IIdentity e IPrincipal personalizados en el servidor

Estoy usando una costumbre IIdentity and IPrincipal en mi ASP.NET MVC aplicación a través de EF 4.3 como se explica aquí (y siga la solución de la respuesta aceptada). Además, tengo una costumbre RoleProvider. En local (usando IIS Express), funciona correctamente. Pero ahora, cuando cargo la aplicación en un host real, parece que todos los usuarios están en "admin" ¡papel! por ejemplo, creo un usuario que no está en el rol "admin", pero puede acceder a todas las páginas protegidas (que necesitan "admin" papel). p.ej Role.IsUserInRole siempre vuelve true. ¿Tienes alguna idea, por favor? ¿Me puedes ayudar? ¿Hay alguna configuración que deba hacer en IIS?

preguntado el 12 de junio de 12 a las 17:06

2 Respuestas

Explico esa solución y me funciona. No lo sé ahora, tal vez deberías retroceder a la AuthenticateRequest evento. Si desea probar de esta manera, debe eliminar RoleManagerModule completamente de su proyecto. Prueba esto y hazme saber si funciona o no:

// in your module:

public void Init(HttpApplication context) {
    _application = context;
    // rollback this line:
    _application.AuthenticateRequest += ApplicationAuthenticateRequest;
}

// and in web.config

<!-- in system.web section: -->
</system.web>
  <!-- other stufs -->
  <httpModules>
    <remove name="RoleManager"/>
  </httpModules>
</system.web>

<!-- and in system.webServer section: -->
<system.webServer>
  <!-- other stufs -->
  <modules runAllManagedModulesForAllRequests="true">
    <remove name="RoleManager"/>
  </modules>
<system.webServer>

Respondido el 12 de junio de 12 a las 21:06

¿Habrá efectos secundarios al eliminar el módulo RolManager? taher chhabrawala

@taherchhabra No, si implementa el proveedor de roles usted mismo. Sí, si desea utilizar el proveedor de roles predeterminado. Para obtener más información, haga una pregunta por separado. - amiri jd

Si desea seguir usando el RoleManager predeterminado, se vuelve difícil. Intenté crear mi propio RoleManager derivando del predeterminado, sin suerte. Después de 2 días probando varias cosas, terminé creando algunos métodos de extensión para RolePrincipal:

public static bool IsEmployee(this RolePrincipal principal)
{
    if (IsAuthenticated())
        return principal.IsInRole("Employee");

    return false;
}

public static bool IsAdmin(this RolePrincipal principal)
{
    if (IsAuthenticated())
        return principal.IsInRole("Admin");

    return false;
}

Creó una nueva clase WebViewPage:

public abstract class BaseViewPage : WebViewPage
{
    public virtual new RolePrincipal User
    {
        get
        {
            if (base.User == null)
                return null;

            return (RolePrincipal)base.User; //Hard casting: If it goes wrong, it better goes wrong here
        }
    }
}

public abstract class BaseViewPage<TModel> : WebViewPage<TModel>
{
    public virtual new RolePrincipal User
    {
        get
        {
            if (base.User == null)
                return null;

            return (RolePrincipal)base.User; //Hard casting: If it goes wrong, it better goes wrong here
        }
    }
}

Modificó el web.config en la carpeta de vistas:

<pages pageBaseType="MyCompany.MyProject.BaseViewPage">

Y todos mis controladores se derivan de mi BaseController:

public abstract class BaseController : Controller
{
    protected virtual new RolePrincipal User
    {
        get { return HttpContext.User as RolePrincipal; }
    }
}

La desventaja es que los métodos consultan mi base de datos cada vez que los llaman. Estoy usando MVC 4 por cierto

Espero que esto ayude a cualquiera

contestado el 12 de mayo de 13 a las 10:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.