asp.net mvc 3 - RoleProvider no funciona con servidores personalizados IIdentity e IPrincipal en el servidor
asp.net-mvc-3 httpmodule (2)
Estoy usando un IIdentity
e IPrincipal
en mi ASP.NET MVC
través de EF 4.3
como se describe aquí (y sigo la solución de respuesta aceptada). Además, tengo un RoleProvider
personalizado. En local (usando IIS Express
), funciona de forma correcta . Pero ahora, cuando subo la aplicación en un host real, ¡parece que todos los usuarios están en el rol de "admin"
! Por ejemplo, creo un usuario que no tiene el rol "admin"
, pero puede acceder a todas las páginas protegidas (que necesitan el rol "admin"
). por ejemplo, Role.IsUserInRole
siempre devuelve true
. ¿Tienes alguna idea, por favor? ¿Me puedes ayudar? ¿Hay algún ajuste que deba hacer en IIS
?
Explico esa solución y funciona para mí. Ahora no, es posible que deba retroceder al evento AuthenticateRequest
. Si desea probarlo de esta manera, debe eliminar RoleManagerModule
completo de su proyecto. Prueba esto y avísame si funciona o nop:
// 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>
Si desea seguir usando el RoleManager predeterminado, se vuelve difícil. Intenté crear mi propio RoleManager derivando del valor predeterminado, sin suerte. Después de 2 días intentando 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 de 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
}
}
}
Se modificó el archivo web.config en la carpeta de vistas:
<pages pageBaseType="MyCompany.MyProject.BaseViewPage">
Y todos mis controladores derivan de mi BaseController:
public abstract class BaseController : Controller
{
protected virtual new RolePrincipal User
{
get { return HttpContext.User as RolePrincipal; }
}
}
Lo malo es que los métodos consultan mi base de datos cada vez que reciben una llamada. Estoy usando MVC 4 por cierto
Espero que esto ayude a cualquiera