0


私は少しトリッキーな状況にあります。宝石のように機能する PageMethod を呼び出す JavaScript の PageMethod 機能を使用しています。ただし、値「SYSTEM」を返すHttpContextの状態にアクセスする際に問題が発生しています

HttpContext.Current.User.Identity.Name

これは実際の現在のユーザー名ではありません。

セッションに HttpContext.Current を保存する、コンテキストの状態を他のカスタム コンテナーに保存するなどのオプションがいくつかあることは知っていますが、Web ファーム環境を考えると、これは期待どおりに機能しないと想定しています。

これが私が取り組んでいるコードです

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 Webフォームで動作させようとしています... :)

したがって、セッションを使用せずにページメソッドで現在の実際のユーザーにアクセスする方法があるかどうか疑問に思っています。

どんな助けでも大歓迎です。

ニキ...

4

1 に答える 1

0

かなり読んだ後、ページメソッドがどのように機能するかについて、正しくないことをしようとしていたと思います。アプリケーションの認証システムが Windows ベースであり、JavaScript から呼び出したときにこれらのページ メソッドがポストバックを引き起こさず、HttpModules を呼び出さない場合は、非常に注意が必要です。代わりに、そのページ メソッドを呼び出すだけです。

参考までに、セキュリティを処理する独自のカスタム HTTPModule がありました。これは、他の HttpModule が発生する前であっても、ページ メソッドの呼び出し中に呼び出されていませんでした。の HTTPPost が欠落していた)。さらに、これにより、認証なしでサービス呼び出しを行っており、セキュリティ上の大きな問題になる可能性があるという結論に至りました。

要するに、それは悪い設計だったということです。まあ、私たちが思いついた解決策/回避策について言及したいと思います.これが私たちがしたことです. そのため、UI を維持したままポストバックを実行するしか方法がありませんでした。ラベルのメッセージを非同期で更新したかったので、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 メソッドを使用しなくなりました。そして、この解決策に基づいて、誰かがここに何かが欠けていると思うか、これを行う他の方法があると思う場合は、提案でこの投稿を更新してください.

  • ニク
于 2011-01-12T19:18:53.980 に答える