Событие Application_PreRequestHandlerExecute не запускается для PageMethods. Что я могу использовать вместо этого?

#asp.net #session #global-asax #pagemethods

#asp.net #сеанс #глобальный-asax #pagemethods

Вопрос:

В этой статье объясняется, что событие PreRequestHandlerExecute не запускается для вызовов PageMethod по какой-либо причине. Однако я пытаюсь использовать это событие для заполнения основного объекта разрешениями пользователя, чтобы их можно было проверить в любом веб-запросе (вызов PageMethod или нет). Я кэширую разрешения в сеансе, поэтому мне нужно событие, которое запускается всякий раз, когда вызывается PageMethod, и мне нужно иметь доступ к сеансу. Таким образом, я могу заполнить основной объект разрешениями безопасности, кэшированными в сеансе, и User.IsInRole() вызовы будут работать должным образом. Какое событие я могу использовать?

Комментарии:

1. Какой-либо из этих ответов решил вашу проблему?

Ответ №1:

Вы должны реализовать модуль авторизации, который будет запускаться при каждом запросе, поступающем на сервер. Таким образом, вы можете авторизовать своего участника для любого запроса, поступающего на сервер (запрос страницы, метод и т.д.)

 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>
  

Я надеюсь, это поможет.

Ответ №2:

Вы можете использовать запрос Application_OnPostAuthenticateRequest, как показано ниже (при условии, что вы используете проверку подлинности в формах. В противном случае, пожалуйста, замените код вашим механизмом аутентификации):

 public void Application_OnPostAuthenticateRequest(object sender, EventArgs e)
{

    IPrincipal usr = HttpContext.Current.User;

    if (usr.Identity.IsAuthenticated amp;amp; 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;
    }

}
  

Комментарии:

1. У меня это не работает — на данный момент у меня нет сеанса.

2. Можете ли вы попробовать HttpContext.Session[«ключ»]?

3. HttpContext.Current. Сеанс равен нулю.

Ответ №3:

Методы страницы являются статическими и обходят обычный жизненный цикл страницы, ее объекты и события. Лучшее, что вы можете сделать, это передать информацию аутентификации в качестве параметров самому методу Page.

Ответ №4:

С моей точки зрения, вы можете:

1. — Используйте общий метод, который вы можете вызвать из любого серверного кода метода страницы, имеющего доступ к переменным сеанса. Пожалуйста, обратитесь к:http://mattberseth.com/blog/2007/06/aspnet_ajax_use_pagemethods_pr.html

2. — Попробуйте зафиксировать подобное поведение позже, используя функцию __doPostBack() для запуска серверного кода. Посмотрите, сработает ли это для вас, чтобы фиксировать асинхронные возвраты метода страницы:http://www.dotnetcurry.com/ShowArticle.aspx?ID=256

Надеюсь, это поможет,