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

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

4 ответа

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

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>

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

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

Вы можете использовать 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;
    }

}

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

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

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

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

Другие вопросы по тегам