当前位置: 首页 > 编程语言 > C#

什么时候执行`PostAuthenticateRequest`?分享

时间:2023-04-10 13:08:32 C#

`PostAuthenticateRequest`什么时候执行?这里是我的Global.asax.cs文件:}//此方法从未被请求调用...protectedvoidMvcApplication_PostAuthenticateRequest(objectsender,EventArgse){如果(authCookie!=null){FormsAuthenticationTicketauthDeicket=FormsAuthenticate(authCookie.Value);varidentity=newGenericIdentity(authTicket.Name,"Forms");varprincipal=newGenericPrincipal(identity,newstring[]{});上下文。用户=主体;}}}何时执行PostAuthenticateRequest?根据文档:当安全模块已建立用户身份时发生。...在AuthenticateRequest事件之后引发PostAuthenticateRequest事件。订阅PostAuthenticateRequest事件的函数可以访问PostAuthenticateRequest处理的任何数据。这就是ASP.NET页面生命周期。但由于您的问题是用ASP.NETMVC标记的,我强烈建议您将其实现到自定义[Authorize]属性中,而不是使用此事件。示例:publicclassMyAuthorizeAttribute:AuthorizeAttribute{protectedoverrideboolAuthorizeCore(HttpContextBasehttpContext){varisAuthorized=base.AuthorizeCore(httpContext);如果(isAuthorized){varauthCookie=httpContext.Request.Cookies[FormsAuthentication.FormsCookieCookieName];如果(=null){varauthTicket=FormsAuthentication.Decrypt(authCookie.Value);varidentity=newGenericIdentity(authTicket.Name,"Forms");varprincipal=newGenericPrincipal(identity,newstring[]{});httpContext.User=主体;}}返回授权;}}现在用[MyAuthorize]属性装饰你的控制器/动作:如果您将代码放在PostAuthenticateRequest上,它可能会在每个请求中命中多次,因为页面上引用的每个资源(例如图像和样式表)都会触发此事件,因为它们被视为单个请求。如果您使用@Darin的回答,当isAuthorized返回false时,AuthorizeAttribute将不会呈现操作,但人们可能无论如何都需要呈现它,即使它是公共页面(不受限制的访问)您可能想要显示“显示名称”保存在authTicket的userData部分。为此,我建议在ActionFilterAttribute(AuthenticationFilter)上加载authCookie:HttpCookieauthCookie=filterContext.HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName];如果(authCookie==null)返回;FormsAuthenticationTicketauthTicket=FormsAuthentication.Decrypt(authCookie.Value);varidentity=newGenericIdentity(authTicket.Name,"Forms");varprincipal=newGenericPrincipal(identity,newstring[]{});//确保Principal同步。参见:https://www.hanselman.com/blog/SystemThreadingThreadCurrentPrincipalVsSystemWebHttpContextCurrentUserOrWhyFormsAuthenticationCanBeSubtle.aspxfilterContext.Principal=filterContext.HttpContext.User=System.Threading.Thread.CurrentPrincipal=principal;}公共无效OnAuthenticamotionChallenge(AuthenticationChallengeContextfilterContext){//此方法负责验证当前主体并允许执行当前操作/请求。//在这里你应该验证当前原则是否有效/是否允许调用当前操作。(但是我会把这个逻辑放到授权过滤器中)//filterContext.Result=newRedirectToRouteResult("CustomErrorPage",null);}}在global.asax.cs上publicstaticvoidRegisterGlobalFilters(GlobalFilterCollectionfilters){filters.Add(newLoadCustomAuthTick());}这样一来,你就不必使用这个属性来填写所有的操作如果所有分享的内容对你都有用,需要了解更多的C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: