asp.net-mvc-4 - permisos - sintaxis razor mvc 5
Autenticación basada en roles en la nueva plantilla de Internet de MVC 4 usando membresía simple (2)
Me gusta la nueva función de membresía simple en la plantilla de Internet MVC 4 con enlaces a OAuth para inicios de sesión externos en VS 2012 RTM. En su mayor parte, la función de autenticación está funcionando. Sin embargo, incluso después de pasar más de 8 horas en esto, no puedo implementar la autorización basada en roles para trabajar en mis controladores. SimpleMembership está resultando ser cualquier cosa menos simple.
Busqué stackoverflow, busqué en Google y leí lo último de John Galloway , intenté muchas sugerencias y todavía no he podido resuelvo este problema. Todo comenzó con el error de conexión Sql y no podía entender por qué cuando la cadena de conexión y todo lo demás estaba bien. Le llevó muchas horas descubrir que es la clase Roles la que está causando el problema.
El atributo [Autorizar] en los controladores funciona como antes para la autenticación básica. Pero cada vez que intento usar Roles da un error de conexión sql (porque revierte al antiguo DefaultRolesProvider que intenta conectarse al archivo predeterminado aspqqExpress aspnetdb y falla). Entonces algo así como:
[Authorize(Roles="admin")]
No funciona. Funcionará si vuelvo a los antiguos proveedores de membresía de asp.net, pero luego pierdo las tablas de base de datos simples, confirmación y recuperación de bases de tokens, hashing de contraseñas más seguro y, lo que es más importante, inicios de sesión externos a través de OAuth.
Lo único que funciona dentro de las vistas de códigos y maquinillas de afeitar es
User.IsInRole("admin")
lo cual está bien para elementos de menú y cosas por el estilo, pero es engorroso de implementar dentro de cada acción en el controlador (y no me gusta que solo pruebe roles únicos a la vez).
Agradeceré cualquier orientación para resolver este problema.
Tuve el mismo problema cuando estaba moviendo mi aplicación web de VS2010 / MVC3 a VS2012 / MVC4.
Y no pude hacer que [InitializeSimpleMembership] funcione.
Descubrí que agregar esto a tu web.config es el truco:
<appSettings>
<add key="enableSimpleMembership" value="false" />
</appSettings>
Y todo funciona bien como lo hizo antes.
Aquí encontré una respuesta de Mehdi Golchin que parece resolver:
[Authorize(Roles="admin,editor,publisher")]
Si también agrego esto al controlador doméstico:
[InitializeSimpleMembership]
Debido a que este atributo está en el controlador de cuentas, la base de datos de SimpleMembership se inicializa solo después del primer uso del controlador de cuentas, como inicio de sesión / registro. Incluso cuando el usuario actual ingresa desde la cookie, la base de datos no se inicializa y arroja un error. Una solución es poner este atributo en el controlador del hogar al que se llama cuando inicio mi sitio web. Pero, luego debe colocarse en cada controlador porque verifico los roles y visualizo diferentes elementos de menú basados en el rol.
Este es un diseño deficiente ya que la base de datos debe inicializarse en App_Start y no cuando se usa por primera vez.
Intenté poner
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
en Global.asax
Application_Start()
, y se encarga de la comprobación de roles en los elementos del menú usando User.IsInRole("admin")
, pero luego arroja un error en cualquier controlador con el atributo [Authorize(Roles="admin")]
, incluso con el atributo adicional [InitializeSimpleMembership]
se aplica.
Entonces, en este momento, la solución es poner `[InitializeSimpleMembership] en todos los controladores ya que un usuario puede inicialmente aterrizar en cualquier página usando enlaces externos.
Todavía no se puede calcular cómo inicializar la clase SimpleRolesProvider para hacer más de la administración de roles en lugar de solo User.IsInRole()
.
Estas cosas funcionan mejor en el sitio web de webmatrix y obviamente el puerto de MVC no está completo. Conflicto y se confunde con los proveedores de membresía de asp.net por defecto.
EDITAR OK No estaba pensando en que el filtro [InitializeSimpleMembership]
pueda aplicar globalmente poniendo esta línea en FilterConfig.cs
en la carpeta App_Start:
filters.Add(new InitializeSimpleMembershipAttribute());
Eso soluciona ese problema. Ahora necesito una solución para la inicialización de SimpleRolesProvider o de lo contrario tendré que escribir mi propio proveedor de roles.
ACTUALIZAR:
Esta publicación de Scott Allen ha resuelto todos mis problemas.
Al incluir esto en web.config:
<roleManager enabled="true" defaultProvider="simple">
<providers>
<clear/>
<add name="simple" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData"/>
</providers>
</roleManager>
<membership defaultProvider="simple">
<providers>
<clear/>
<add name="simple" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData"/>
</providers>
</membership>
todos los métodos de las clases Roles y Membresía están disponibles y se pueden inicializar en el código de la siguiente manera:
var roles = (SimpleRoleProvider) Roles.Provider;
var membership = (SimpleMembershipProvider) Membership.Provider;