Событие Application_PreRequestHandlerExecute не вызывается для PageMethods.Что я могу использовать вместо этого? - PullRequest
1 голос
/ 13 июня 2011

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

Ответы [ 4 ]

2 голосов
/ 13 июня 2011

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

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 голос
/ 13 июня 2011

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

1 голос
/ 13 июня 2011

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

}
0 голосов
/ 13 июня 2011

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

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

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

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

...