2010-12-29 21 views
0


私は少しトリッキーな状況にあります。私はJavaScriptのPageMethod機能を使用しています。ここでは、宝石のように動作するPageMethodを呼び出しています。しかし、私は私の実際の現在のユーザー名ではありませんJavaScript PageMethodsは、HttpContextを呼び出すときに呼び出されます。現在の状態

HttpContext.Current.User.Identity.Name

の値「SYSTEM」を返すのHttpContextの状態にアクセスする際に問題が生じています。

セッションにHttpContext.Currentを保存したり、他のカスタムコンテナにコンテキストの状態を保存したりするようなカップルオプションがあることは知っていますが、期待通りに動作しないと仮定しています。ここで

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

また、私はのOnLoadイベントで、ユーザー名にアクセスするには上記のコードを使用している場合、サーバーメソッドのシグネチャ私がここ

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

で働いているコードされていますページが正常に動作し、CurrentUserNameを返します。私は、ASP.NETのWebフォームで動作するように上記のコードを取得しようとしています

...だから使用せずにページの方法で現在の実際のユーザーにアクセスする方法があれば、私は疑問に思って

:)セッションの

ご協力いただければ幸いです。

NIK ...私はページの方法がどのように機能するかについての正しくない何かをしようとしていたと思うかなり読んだ後

+0

ちょうどあなたが何の認証モードを使用している不思議?権限/偽装のためのweb.config内の他の設定 – gbs

+0

私の質問を読む時間を取ってくれてありがとう...私たちはActive Directoryを介してWindowsベースの認証を使用しています – NiK

+0

私は私のweb.configで認証モード= "Windows"で私のローカルiisのクイックテストを実行し、ユーザーを拒否= ? " mydomain/usernameを取得しました。私の設定とは違う何かがあります。 – gbs

答えて

0

。アプリケーションの認証システムがWindowsベースで、JavaScriptから呼び出すときにこれらのページメソッドがポストバックを引き起こさず、HttpModuleを呼び出さないときは、非常に扱いにくいものになります。代わりに、そのページメソッドを呼び出します。

FYIでは、セキュリティを処理する独自のカスタム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ページメソッドを使用しなくなりました。誰かが私がここで何かを見逃していると思っている、あるいはこれをやっている他の方法があると思うなら、この解決策に基づいて、この投稿をあなたの提案で更新してください。

  • NIK
関連する問題