对于PageMethods,不会触发Application_PreRequestHandlerExecute事件。我可以用什么呢?

时间:2011-06-13 17:26:35

标签: asp.net session global-asax pagemethods

This article解释说,无论出于何种原因,PreRequestHandlerExecute事件都不会触发PageMethod调用。但是,我正在尝试使用该事件使用用户的权限填充Principal对象,以便可以在任何Web请求中检查它们(PageMethod调用与否)。我正在缓存Session中的权限,所以我需要一个在调用PageMethod时触发的事件,并且我需要访问Session。这样,我可以使用会话中缓存的安全权限填充Principal对象,User.IsInRole()调用将按预期工作。我可以使用什么活动?

4 个答案:

答案 0 :(得分:2)

您应该实现一个授权模块,该模块将随每个前往服务器的请求一起运行。通过这种方式,您可以为服务器上的任何请求授权您的主体(页面请求,方法等)

public class AuthorizationModule : IHttpModule, IRequiresSessionState
{
    //not going to implement it fully, might not compile

    public void Init( HttpApplication context )
    {
       //you'll prolly want to hook up to the acquire request state event, but read up to make sure this is the one you want on the msdn
       context.AcquireRequestState += AuthorizeRequest;
    }

    public void AuthorizeRequest( HttpContextBase httpContext )
    {
       // do you work in here

       // you can redirect them wherever if they don't have permssion, log them out, etc
    }
  }
}

在创建模块后,您需要在web.config中将其连接起来。您的类型应该包含命名空间(如果有的话)。

<httpModules>
  <add name="AuthorizationModule" type="AuthorizationModule"/>
</httpModules>

我希望这会有所帮助。

答案 1 :(得分:1)

您可以使用Application_OnPostAuthenticateRequest,如下所示(假设您正在使用表单身份验证。否则,请使用您的身份验证机制替换代码):

public void Application_OnPostAuthenticateRequest(object sender, EventArgs e)
{

    IPrincipal usr = HttpContext.Current.User;

    if (usr.Identity.IsAuthenticated && usr.Identity.AuthenticationType == "Forms")
    {
        var fIdent = (FormsIdentity)usr.Identity;
        var ci = new CustomIdentity(fIdent.Ticket);
        var p = new CustomPrincipal(ci);

        HttpContext.Current.User = p;
        Thread.CurrentPrincipal = p;
    }

}

答案 2 :(得分:1)

页面方法是静态的,并绕过正常的页面生命周期,其对象及其事件。您可以做的最好的事情是将身份验证信息作为参数传递给Page方法本身。

答案 3 :(得分:0)

从我的观点来看,你可以:

1.-使用可以从可以访问Session变量的每个页面方法服务器代码调用的常用方法。请参阅:  http://mattberseth.com/blog/2007/06/aspnet_ajax_use_pagemethods_pr.html

2.-尝试稍后使用__doPostBack()函数捕获类似行为以运行服务器代码。看看这是否适合您捕获页面方法异步后退:  http://www.dotnetcurry.com/ShowArticle.aspx?ID=256

希望有所帮助,