#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
Надеюсь, это поможет,