JavaScript PageMethods вызывает потерю HttpContext.Current State - PullRequest
0 голосов
/ 30 декабря 2010


Я в некоторой сложной ситуации.Я использую функциональность JavaScript PageMethod, где я вызываю PageMethod, который работает как драгоценный камень.Однако у меня возникла проблема с доступом к состоянию HttpContext, которое возвращает мне значение «SYSTEM» для

HttpContext.Current.User.Identity.Name

, которое не является действительным текущим именем пользователя.

Я знаю, что есть пара вариантов, таких как хранение HttpContext.Current в сеансе или сохранение состояния контекста в каком-либо другом пользовательском контейнере, но учитывая среду веб-фермы, я предполагаю, что это не будет работать должным образом.

Вот код, над которым я работаю

function MyFunction(){
    PageMethod.MyPageMethod();
}

Вот подпись метода сервера

    [System.Web.Services.WebMethod()]
    public static void MyPageMethod()
    {
       // gives me "SYSTEM"
       var user = HttpContext.Current.User.Identity.Name;
    }   

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

Я пытаюсь заставить приведенный выше код работать в веб-форме ASP.NET ...:)

Поэтому мне интересно, есть ли способ получить доступ к текущему фактическому пользователю на странице?методы без использования сессий.

Любая помощь будет высоко ценится.

NiK ...

1 Ответ

0 голосов
/ 12 января 2011

После некоторого прочтения я думаю, что пытался сделать что-то, что не правильно относительно того, как работают методы страницы. Это становится довольно сложно, когда система аутентификации вашего приложения основана на Windows, и эти методы страницы, когда вы вызываете из JavaScript, не будут вызывать обратную передачу и не вызывают HttpModules. Вместо этого он просто вызывает метод этой страницы.

К вашему сведению, у нас был собственный настраиваемый HTTPModule для управления безопасностью. Это происходит еще до того, как возникает любой другой HttpModule, и он не вызывался при вызове метода страницы, поскольку мы не выполняем обратную передачу или даже частичную обратную передачу (так что весь «ниша» HTTPPost отсутствовала). Более того, это привело к выводу, что мы выполняем сервисные вызовы без какой-либо аутентификации и потенциально является для нас большой проблемой безопасности.

Суть в том, что это был плохой дизайн, хорошо говоря, что я хотел бы упомянуть о решении / обходном пути, к которому мы пришли, и вот что мы сделали. Итак, единственный вариант, который у нас был, - это сделать обратную передачу, поддерживая пользовательский интерфейс, и мы хотели обновить сообщение метки асинхронно, и мы добились этого, взломав с помощью Sys.Application.add_init.

<script language="javascript" type="text/javascript" >
    Sys.Application.add_init(function() {
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequest);
    });  

      function beginProcess() {           
        processCurrentItem();
    }

       var currentItem = 0;
      function processCurrentItem() {
         if (currentItem < 5) {
            currentItem = currentItem + 1;
            __doPostBack('updatePanel', currentItem);                
        }
    }
     function endRequest() {
       processCurrentItem();
    }
    </script>

Разметка, которую мы установили, была довольно простой, с меткой на панели обновлений и кнопкой, которая вызывает функцию beginProcess (). Наконец, в OnLoad у нас был следующий код

protected override void OnLoad(EventArgs e)
    {
        if (this.IsPostBack)
        {               
           this.lblLabel.Text = "text you may wanna update with";
           // Call the Method you may wanna call 
           // also you may use Request["__EVENTARGUMENT"] to know who caused the 
           // postback and Request["__EVENTTARGET"] to access the argument you may 
           // have passed in. 
        }            
    }

И это решение больше не использует методы JavaScript Page. И на основании этого решения, если кто-то сочтет, что я что-то здесь упускаю, или считает, что есть какой-то другой способ сделать это, тогда обновите этот пост своими предложениями.

  • NiK
...