with usuario usernamepasswordvalidator seguridad password membershipprovider example custom contraseña and asp.net ajax json authentication asp.net-membership

asp.net - usuario - Cómo establecer Request.IsAuthenticated en true cuando no se usa FormsAuthentication.RedirectFromLoginPage?



wcf seguridad username (3)

FormsAuthentication.SetAuthCookie

Método Crea un ticket de autenticación para el nombre de usuario proporcionado y lo agrega a la colección de cookies de la respuesta, o a la URL si usa autenticación sin cookies.

Ref: msdn

Eche un vistazo al flujo de control de autenticación de formularios . La cookie de autenticación se establece en la colección de cookies de respuesta, y debe ser observable en el nivel de protocolo http (por ejemplo, use FireCookie o Fiddler2 para verificar esto).

La membresía solo verifica un nombre de usuario / contraseña. Ni Membership ni SetAuthCookie() modificarán la solicitud actual. Esperan enviar de nuevo la cookie a la persona que llama, y ​​la siguiente solicitud es cuando las propiedades como IsAuthenticated se devolverán verdaderas.

Tenga en cuenta que puede anular y ampliar estos procesos automáticos utilizando IIdentity e IPrincipal , y enganchar en los eventos de autenticación si es necesario.

También eche un vistazo a msdn.microsoft.com/en-us/library/bb398896.aspx

Estoy usando Form Authentication y enviando una solicitud Aajx al servidor para autenticación. Basado en el resultado json, el cliente decide dónde ir y qué hacer. Esa es la razón por la que no estoy usando FormsAuthentication.RedirectFromLoginPage para no interferir con la respuesta ajax / json.

En este caso, Request.IsAuthenticated devuelve false, incluso después de validar al usuario con Membership.ValidateUser. Luego configuro la cookie usando

FormsAuthentication.SetAuthCookie(username, false);

Aunque el segundo parámetro, cookie persistente, es falso, la cookie sigue siendo válida en todas las sesiones del navegador.

¿Alguna idea de cómo hacer el trabajo Request.IsAuthenticated sin usar FormsAuthentication.RedirectFromLoginPage?


Necesita actualizar el principal de seguridad actual para la solicitud. Cuando llamas Response. Redirect(...) Response. Redirect(...) una nueva solicitud y el principal de seguridad se reinicia y Request.IsAuthenticated devuelve verdadero en su caso. FormsAuthentication.RedirectFromLoginPage llama internamente a Response. Redirect(...) Response. Redirect(...) . Puede renovar manualmente el principal de seguridad para la solicitud actual de esta manera:

public void RenewCurrentUser() { System.Web.HttpCookie authCookie = System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; if (authCookie != null) { FormsAuthenticationTicket authTicket = null; authTicket = FormsAuthentication.Decrypt(authCookie.Value); if (authTicket != null && !authTicket.Expired) { FormsAuthenticationTicket newAuthTicket = authTicket; if (FormsAuthentication.SlidingExpiration) { newAuthTicket = FormsAuthentication.RenewTicketIfOld(authTicket); } string userData = newAuthTicket.UserData; string[] roles = userData.Split('',''); System.Web.HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(new FormsIdentity(newAuthTicket), roles); } } }


Redirigir después de un POST es la mejor práctica, y debe considerarse la solución correcta.

En algunos casos, es posible que desee averiguar si un usuario está autenticado dentro del alcance de la solicitud de autenticación (por ejemplo, si está ejecutando lógica adicional después de que se realizó la autenticación que se comparte con otras solicitudes).

En este caso, puede restablecer el valor de Request.IsAuthenticated con el siguiente código:

// set the forms auth cookie FormsAuthentication.SetAuthCookie(username, createPersistentCookie); // reset request.isauthenticated var authCookie = System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; if (authCookie != null) { FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); if (authTicket != null && !authTicket.Expired) { var roles = authTicket.UserData.Split('',''); System.Web.HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(new FormsIdentity(authTicket), roles); } }

Ver publicación aquí: http://abadjimarinov.net/blog/2010/01/24/RenewUserInTheSameRequestInAspdotNET.xhtml