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