Cuando `PostAuthenticateRequest` se ejecuta?

Este es mi archivo Global.asax.cs :

 public class MvcApplication : System.Web.HttpApplication { public static void RegisterRoutes(RouteCollection routes) { ... } protected void Application_Start() { this.PostAuthenticateRequest += new EventHandler(MvcApplication_PostAuthenticateRequest); } // This method never called by requests... protected void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e) { HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; if (authCookie != null) { FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); var identity = new GenericIdentity(authTicket.Name, "Forms"); var principal = new GenericPrincipal(identity, new string[] { }); Context.User = principal; } } } 

Cuando se ejecuta PostAuthenticateRequest ?

De acuerdo con la documentación :

Se produce cuando un módulo de seguridad ha establecido la identidad del usuario.

El evento PostAuthenticateRequest se genera después de que se haya producido el evento AuthenticateRequest. La funcionalidad que se suscribe al evento PostAuthenticateRequest puede acceder a cualquier dato procesado por PostAuthenticateRequest.

Y aquí está el ciclo de vida de la página ASP.NET .

Pero debido a que su pregunta está etiquetada con ASP.NET MVC, le recomiendo que realice esto en un atributo [Authorize] lugar de usar este evento. Ejemplo:

 public class MyAuthorizeAttribute : AuthorizeAttribute { protected override bool AuthorizeCore(HttpContextBase httpContext) { var isAuthorized = base.AuthorizeCore(httpContext); if (isAuthorized) { var authCookie = httpContext.Request.Cookies[FormsAuthentication.FormsCookieName]; if (authCookie != null) { var authTicket = FormsAuthentication.Decrypt(authCookie.Value); var identity = new GenericIdentity(authTicket.Name, "Forms"); var principal = new GenericPrincipal(identity, new string[] { }); httpContext.User = principal; } } return isAuthorized; } } 

Ahora decora tus controladores / acciones con el atributo [MyAuthorize] :

 [MyAuthorize] public ActionResult Foo() { // if you got here the User property will be the custom // principal you injected in the authorize attribute ... } 

Si coloca su código en PostAuthenticateRequest, puede recibir un golpe muchas veces por solicitud, ya que todos los recursos, como las imágenes y las hojas de estilo a las que se hace referencia en su página, activarán este evento ya que se tratan como solicitudes separadas.

Si elige la respuesta de @ Darin, AuthorizeAttribute no procesará la acción cuando isAuthorized devuelva false, pero las personas pueden necesitar que se represente de todos modos, incluso si es una página pública (acceso no restringido) es posible que desee mostrar un “Nombre para mostrar”. “guardado en la parte userData del authTicket.

Para eso, recomiendo cargar AuthCookie en ActionFilterAttribute (AuthenticationFilter):

 public class LoadCustomAuthTicket : ActionFilterAttribute, IAuthenticationFilter { public void OnAuthentication(AuthenticationContext filterContext) { if (!filterContext.Principal.Identity.IsAuthenticated) return; HttpCookie authCookie = filterContext.HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName]; if (authCookie == null) return; FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); var identity = new GenericIdentity(authTicket.Name, "Forms"); var principal = new GenericPrincipal(identity, new string[] { }); // Make sure the Principal's are in sync. see: https://www.hanselman.com/blog/SystemThreadingThreadCurrentPrincipalVsSystemWebHttpContextCurrentUserOrWhyFormsAuthenticationCanBeSubtle.aspx filterContext.Principal = filterContext.HttpContext.User = System.Threading.Thread.CurrentPrincipal = principal; } public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext) { //This method is responsible for validating the current principal and permitting the execution of the current action/request. //Here you should validate if the current principle is valid / permitted to invoke the current action. (However I would place this logic to an authorization filter) //filterContext.Result = new RedirectToRouteResult("CustomErrorPage",null); } } 

Y en global.asax.cs

 public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new LoadCustomAuthTicket()); } 

De esta forma, tampoco tendrá que completar todas sus acciones con el atributo.