asp.net - tutorial - mvc 4 visual studio 2015 download
Debe llamar al método "WebSecurity.InitializeDatabaseConnection" antes de llamar a cualquier otro método de la clase "WebSecurity" (5)
Agregué el truco [InitializeSimpleMembership] (como se mencionó y encontré en AccountController) a la parte superior del controlador que necesitaba para acceder a WebSecurity. Sin embargo, no estoy seguro si es el método de implementación previsto ...
[InitializeSimpleMembership]
public class DataController : Controller
{ ... }
No puedo hacer que el objeto WebSecurity funcione en ningún lado, excepto lo que ya se ha generado en el archivo AccountController.cs. El controlador de cuenta tiene el atributo [InitializeSimpleMembership]
establecido en la parte superior. Las funciones de inicio de sesión no se quejan de llamar a WebSecurity.Login(...)
, por ejemplo. Agregué una acción hija a AccountController:
[ChildActionOnly]
[AllowAnonymous]
public ActionResult NavBar()
{
NavBarViewModel viewModel = new NavBarViewModel();
viewModel.LinkItems = new List<NavBarLinkItem>();
if (Request.IsAuthenticated)
{
SimpleRoleProvider roleProvider = new SimpleRoleProvider();
if (roleProvider.IsUserInRole(User.Identity.Name, "User"))
{
viewModel.LinkItems.Add(new NavBarLinkItem()
{ Title = "Create Project", Action = "Create", Controller = "Project" });
}
}
viewModel.LinkItems.Add(new NavBarLinkItem() { Title="Help", Action="Index", Controller="Help" });
return PartialView("_NavBar", viewModel);
}
Dejado como está, el código se bloquea en la línea "if (roleProvider.IsUserInRole (User.Identity.Name," User "))" con el mensaje de error del sujeto. Así que voy al archivo InitialzeSimpleMembershipAttribute.cs y copio / pego esta línea en la parte superior de mi función:
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
... y aparece un mensaje de error que indica que WebSecurity.InitializeDatabaseConnection solo debe invocarse una vez. Esto tiene sentido, porque hay un atributo en la parte superior de la definición del controlador que ya debería haber llamado a esta función (y parece que lo hace muy bien). Entonces para estar seguro, cambio la llamada anterior a:
if (!WebSecurity.Initialized)
{
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId",
"UserName", autoCreateTables: true);
}
... y recupere el mensaje de error original, que WebSecurity.InitializeDatabaseConnection debe ser llamado antes de blah blah blah. Cualquier apreciación de esta locura sería muy apreciada
Aquí hay una mejor explicación: http://odetocode.com/blogs/scott/archive/2012/09/24/perils-of-the-mvc4-accountcontroller.aspx
Esto es todo lo que tienes que hacer:
- Quite
[InitializeSimpleMembership]
de la parte superior delAccountController
- Copie la
WebSecurity.InitializeDatabaseConnection(...)
desde /Filters/InitializeSimpleMembershipAttribute.cs (línea 39) a /AppStart/AuthConfig.cs - No dude en eliminar InitializeSimpleMembershipAttribute.cs de su proyecto
No tiene que agregar la llamada InitializeDatabaseConnection()
a AuthConfig.RegisterAuth()
pero parece ser el lugar lógico y mantiene su limpiador Global.asax más limpio.
Lo que básicamente está haciendo es extraer la llamada de inicialización del atributo original y llamarla explícitamente en Application_Start. Todo lo demás en el atributo es solo una verificación condicional en caso de que no esté usando (o no lo necesite) SimpleMembership.
En mi caso, tuve que deshabilitar la Autenticación Anónima dentro de la configuración de Autenticación IIS.
Luego tuve que habilitar Formularios y Autenticación de Windows. Esto, por supuesto, dependerá de la autenticación que requiera para su aplicación.
Una vez que lo hice, el error desapareció y la aplicación funcionó como se esperaba.
Encontré esto en interwebs: http://forums.asp.net/t/1718361.aspx/1 Básicamente, no use el tipo SimpleRoleProvider. Hay un objeto Roles disponible que permite llamadas simples como esta:
if (Request.IsAuthenticated)
{
if( Roles.IsUserInRole(User.Identity.Name, "User"))
{
viewModel.LinkItems.Add(new NavBarLinkItem()
{ Title = "Create Project", Action = "Create", Controller = "Campaign" });
}
}
Primero, debe establecer su rol y proveedor de membresía en el web.config:
<authentication mode="Forms">
<forms loginUrl="/Account/Login" slidingExpiration="true" timeout="60" />
</authentication>
<membership defaultProvider="p1">
<providers>
<add name="p1" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData"/>
</providers>
</membership>
<roleManager enabled="true" defaultProvider="p1">
<providers>
<add name="p1" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData"/>
</providers>
</roleManager>
Cuando crea una nueva instancia de SimpleRoleProvider, use el constructor no nulo y proporcione el conjunto RoleProvider predeterminado en el archivo web.config como argumento:
SimpleRoleProvider srp = new SimpleRoleProvider(Roles.Provider);
La solución es la misma en el caso de SimpleMembershipProvider:
SimpleMembershipProvider msp = new SimpleMembershipProvider(Membership.Provider);