c# - tutorial - membership asp net visual studio 2015
Membresía de ASP.NET: cómo configurar el usuario como registrado (4)
Estoy tratando de hacer que el Proveedor de Membresía trabaje.
Hasta ahora tengo:
<asp:Login ID="Login1" runat="server" OnAuthenticate="Login1_Authenticate">
</asp:Login>
llamando
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
if(Membership.ValidateUser(Login1.UserName, Login1.Password))
{
Response.Redirect("/admin/default.aspx");
// Set the user as logged in?
}
}
Si ingreso el nombre de usuario / contraseña correcto, la función ValidateUser devuelve verdadero. Así que mi pregunta es: ¿cómo configuro al usuario como conectado?
Estoy probando esto en mis páginas haciendo:
protected void Page_Load(object sender, EventArgs e)
{
if ( Membership.GetUser()==null)
{
Response.Redirect("/admin/login.aspx");
}
// else "you are logged in, congratulations"
}
Habría usado las funciones predeterminadas, pero simplemente no funciona y una búsqueda en Google me hizo pensar que ahorraré tiempo al recodificar todo eso.
¡Cualquier cosa ayudará!
EDITAR : En cuanto a la respuesta aceptada, es la correcta para "cómo configurar el usuario como conectado" y funciona bien. No solucionó mi problema específico, sino solo una parte de él. Pensé que si miras bien los comentarios encontrarás interesantes indicaciones.
EDIT 2 y solución: Ok, finalmente lo resolví gracias a todos los comentarios. Esto es lo que hice, es más simple de lo que esperaba:
Página que comprueba el estado de inicio de sesión:
protected void Page_Load(object sender, EventArgs e)
{
if ( !Request.IsAuthenticated)
{
Response.Redirect("/admin/login.aspx");
}
Cerrar sesión:
protected void LoginStatus1_Logout(object sender, LoginCancelEventArgs e)
{
FormsAuthentication.SignOut();
Response.Redirect("/admin/login.aspx");
}
}
web.config:
<authentication mode="Forms" />
iniciar sesión:
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
if(Membership.ValidateUser(Login1.UserName, Login1.Password))
{
FormsAuthentication.SetAuthCookie(Login1.UserName, true);
Response.Redirect("/admin/default.aspx");
}
}
Gromer tiene la respuesta, pero también puede consultar este artículo de MSDN para obtener más información:
Intente mover su código y la sugerencia de Gromer al evento LoggedIn.
protected void Login1_LoggedIn(object sender, EventArgs e)
{
if(Membership.ValidateUser(Login1.UserName, Login1.Password))
{
FormsAuthentication.SetAuthCookie(Login1.UserName, true);
Response.Redirect("/admin/default.aspx");
}
}
EDITAR: Como dijo Gromer, solo haga esto si tiene que ejecutar algún código de negocio después de que el usuario haya iniciado sesión y antes de que él / ella sea redirigido.
EDITAR EDITAR: Visual Studio describe el evento de autenticación como "llamado para autenticar al usuario", lo que implica que el usuario no está autenticado antes de que se llame al evento. Por lo tanto, no puede confirmar que el usuario haya iniciado sesión porque aún no se ha autenticado.
Ponga esto en Login1_Authenticate
antes de llamar a Response.Redirect("/admin/default.aspx");
FormsAuthentication.SetAuthCookie("username", true);
Si bien no sé cuánta ayuda será, este es el código que utilizo para discernir entre usuarios administradores o usuarios regulares. Funciona muy bien para mí.
En su página de inicio de sesión, probablemente haga clic en crear su objeto de usuario y llamar a alguna función con este código (UserRole es un Enum con sus roles):
If admin Then
If role = UserRole.Admin Then
RedirectFromLoginPage(username & "|" & userid, False)
Return True
Else
Return False
End If
Else
If String.IsNullOrEmpty(Current.Request.QueryString("ReturnUrl")) Then
SetAuthCookie(username & "|" & userid, True)
Else
RedirectFromLoginPage(username & "|" & userid, True)
End If
Return True
End If
En su web.config:
<location path="admin">
<system.web>
<authorization>
<allow roles="Admin"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
.....
<system.web>
<authentication mode="Forms">
<forms loginUrl="/registration/login.aspx" timeout="129600"/>
</authentication>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
... y si realmente quieres, en tu página de Global.asax:
Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)
If Request.IsAuthenticated Then
''''
''get your roles for the current user''
''''
Dim userRoles() As String = Split(roles, "|")
''Add the roles to the User Principal''
HttpContext.Current.User = New GenericPrincipal(User.Identity, userRoles)
End If
End Sub