.net forma de autenticación de pregunta
-
11-10-2019 - |
Pregunta
Estoy trabajando en una página de inicio de sesión personalizado en mvc.net. Reviso los inicios de sesión de este modo:
public bool Login(string login, string password, bool persistent)
{
var loginEntity = this.AdminRepository.GetLogin(login, password);
if (loginEntity != null)
{
FormsAuthentication.SetAuthCookie(login, persistent);
HttpContext.Current.Session["AdminId"] = loginEntity.AdminId;
HttpContext.Current.Session["AdminUsername"] = loginEntity.Username;
return true;
}
entonces i decorar cualquier controlador que necesita acceso de administrador con un atributo de filtro:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var ctx = HttpContext.Current;
// check if session is supported
if (ctx.Session != null)
{
var redirectTargetDictionary = new RouteValueDictionary();
// check if a new session id was generated
if (ctx.Session.IsNewSession)
{
// If it says it is a new session, but an existing cookie exists, then it must
// have timed out
string sessionCookie = ctx.Request.Headers["Cookie"];
if (((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) || null == sessionCookie)
{
redirectTargetDictionary = new RouteValueDictionary();
redirectTargetDictionary.Add("area", "Admin");
redirectTargetDictionary.Add("action", "LogOn");
redirectTargetDictionary.Add("controller", "Home");
filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);
}
} else if (SessionContext.AdminId == null) {
redirectTargetDictionary = new RouteValueDictionary();
redirectTargetDictionary.Add("area", "Admin");
redirectTargetDictionary.Add("action", "LogOn");
redirectTargetDictionary.Add("controller", "Home");
filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);
}
}
base.OnActionExecuting(filterContext);
}
Me ver que después del registro en el que tengo dos galletas:
- ASPXAUTH (con juego fecha de caducidad a "fin de la sesión A" (cuando persiste es falso) OR (30 min desde ahora (cuando persiste se establece en true)
- y ASP.NET_SessionId que tiempo de expiración es siempre "al final de sesión "
Pregunta: El problema es que a pesar de que me puse a TRUE opción "persiste" (que establecerá ASPXAUTH tiempo de caducidad de 30 minutos a partir de ahora -que es bueno) mi sesión [ "adminid"] es siempre nula después de cerrar y volver a abrir el navegador. ¿Cómo me aseguro de que mi Sesiones (Session [ "adminid"] y la Sesión [ "AdminUsername"]) se tira desde la cookie cuando inicialmente no ajuste "persiste" true y cierre a continuación, volver a abrir la ventana browswer. gracias
Solución 2
He encontrado mi solución aquí: Es posible el uso de .ASPXAUTH para mi propio sistema de registro?
y esto es lo que hice:
public class SessionExpireFilterAttribute : ActionFilterAttribute
{
/// <summary>
/// Controller action filter is used to check whether the session is still active. If the session has expired filter redirects to the login screen.
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var ctx = HttpContext.Current;
// check if session is supported
if (ctx.Session != null)
{
// check if a new session id was generated
if (ctx.Session.IsNewSession)
{
var identity = ctx.User.Identity;
// If it says it is a new session, but an existing cookie exists, then it must
// have timed out
string sessionCookie = ctx.Request.Headers["Cookie"];
if (((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) || null == sessionCookie)
{
var redirectTargetDictionary = new RouteValueDictionary();
redirectTargetDictionary.Add("area", string.Empty);
redirectTargetDictionary.Add("action", "LogOn");
redirectTargetDictionary.Add("controller", "User");
filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);
}
// Authenticated user, load session info
else if (identity.IsAuthenticated)
{
var loginRepository = new LoginRepository(InversionOfControl.Container.Resolve<IDbContext>());
IAuthenticationService authenticationService = new AuthenticationService(loginRepository);
authenticationService.SetLoginSession(identity.Name);
}
}
else if (SessionContext.LoginId == null)
{
var redirectTargetDictionary = new RouteValueDictionary();
redirectTargetDictionary.Add("area", string.Empty);
redirectTargetDictionary.Add("action", "LogOn");
redirectTargetDictionary.Add("controller", "User");
filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);
}
}
base.OnActionExecuting(filterContext);
}
}
Otros consejos
Una cookie con un tiempo de expiración se escribe en el disco. El usuario será por lo tanto todavía puede registrar en la próxima vez que abren un navegador, a condición de que la cookie no ha caducado.
Una cookie de sesión sólo se almacena en la memoria y se pierde en cuanto se cierra el navegador.
Una cookie de sesión es una galleta que no tienen fecha de caducidad.