19

最近、VisualStudio2008でasp.netWebアプリを実行する際に問題が発生しました。「メンバー...customUserPrincipalのタイプが解決されていません」というエラーが表示されます。さまざまなディスカッショングループを追跡すると、Thread.CurrentPrincipalに対してカスタムプリンシパルを割り当てるときにVisualStudioのWebサーバーに問題があるようです。

私のコードでは、今は...を使用しています。

HttpContext.Current.User = myCustomPrincipal
//Thread.CurrentPrincipal = myCustomPrincipal

エラーが発生したことをうれしく思いますが、「プリンシパルを設定するこれら2つの方法の違いは何ですか?」という疑問が生じます。違いに関連する他のスタックオーバーフローの質問がありますが、2つのアプローチの詳細には触れていません。

私は次の壮大なコメントを持っているが彼の主張を裏付ける説明がない魅力的な投稿を1つ見つけました...

すべてのWeb(ASPX / ASMX)アプリケーションにHttpConext.Current.Userを使用します。

winForms、コンソール、Windowsサービスアプリケーションなどの他のすべてのアプリケーションには、Thread.CurrentPrincipalを使用します。

security / dot.netの達人の誰かが、このテーマに光を当てることができますか?

4

3 に答える 3

25

HttpApplicationオブジェクトがスレッドを取得するときに最初に行うことは、スレッドのプリンシパルをHttpContextのプリンシパルに設定することです。これにより、プリンシパルが同期されます。

ただし、後でスレッドのプリンシパルを設定した場合でも、HttpApplicationの内部にはユーザーコンテキスト用に異なるプリンシパルが設定されています。これが、常にHttpContextを介して設定する必要がある理由です。

(Reflectorを見ると、HttpContext.Userで「設定」を実行したときに実行される複雑なコードを確認できます。これは、プリンシパルを適切に設定するためにIISで多くの内部処理を実行します。)

于 2010-06-16T23:56:12.140 に答える
7

WebフォームアプリケーションでThread.CurrentPrincipalは、ワーカープロセス(スレッド)を実行している人のプリンシパルになると思います。

HttpContext.Current.User現在ログインしているWebユーザーになります。

forms / wpfアプリの場合、アプリケーションを実行しているユーザーが関心のあるユーザーであるため、これは理にかなっています。

ワーカープロセスまたはログインしているユーザーを偽装しようとしていますか?

于 2010-06-16T23:46:33.630 に答える
5

この記事はそれを説明していますか?

http://www.hanselman.com/blog/CommentView.aspx?guid=22c42b73-4004-40ce-8af9-47f1b9b434ed

抜粋は次のとおりです。

ASP.NETカスタムFormsAuthenticationログインに次のようなコードがあります。

// This principal will flow throughout the request.
VoyagerPrincipal principal = new VoyagerPrincipal(yada, yada, yada);

// Attach the new principal object to the current HttpContext object
HttpContext.Current.User = principal;

これはGlobal.asaxのAuthenticateRequestで呼び出されるため、ページのイベントが発生する前にすべてがセットアップされます。これは、eFinanceサーバーをASP.NETと統合するカスタムIPrincipalを提供します。それはとても素敵なサブシステム、IMHOです。

他の操作は、現在のスレッドからいつでもこの「コンテキストの呼び出し」IPrincipalを取得できることを期待しています。コードの別のセクションでは、上記のルーチンを初めて呼び出した後、誰かがHttpRequestの中央(Page_Loadのどこか)でこれを行っていました。

return Thread.CurrentPrincipal as VoyagerPrincipal;

誰かがコードの最初のチャンクを呼び出してから、同じHttpRequest内の2番目のチャンクを呼び出すことができると期待する場合、Thread.CurrentPrincipalには、HttpApplicationによってはるかに前に設定されたGenericPrincipalが含まれます。(または、設定に応じてWindowsPrincipal)。

于 2010-06-16T23:50:22.650 に答える