ログインという処理のあるWPFアプリケーションで、ユーザがログインしていることを示すのにThread.CurrentPrincipalを使用する場合、Thread.CurrentPrincipalはどこで(いつ)設定するのが一般的でしょうか?
例えば、WPFアプリケーションを普通に作成した場合は、Application(を継承したApp)のStartupイベントなどが、アプリケーションの初期化タイミングになると思いますが、ここでThread.CurrentPrincipalを設定してもイベント終了後に元に戻ってしまいます。
調べてみた感じでは、Startupイベント自体もディスパッチャで非同期に実行されるため、StartupイベントではSecurityContextがフローされた状態になっており、イベント終了時にSecurityContextが元に戻されて、Thread.CurrentPrincipalも元に戻る、ということのように思われます。
回避方法としては、Mainを自作して、ディスパッチャなどを介さないメインの流れで直にThread.CurrentPrincipalをセットするか、StartupイベントでSecurityContext.SuppressFlowした上でディスパッチャのBeginInvokeでThread.CurrentPrincipalをセットする処理をキューに登録しておく(Startupイベント終了後に、SecurityContextをフローさせないでThread.CurrentPrincipalを設定する)、辺りが考えられます。
いずれも試した限りではうまく動作したのですが、どうにも強引というか行き当たりばったりな感が否めません。
普通はこうするだろう、こうするのが正しいというような、あるいは正当な方法が用意されているならそれを使いたいのですが、どうにも見つからない状態です。
どなたかこの辺り情報をお持ちでないでしょうか?
--追記
ちょっと訂正、SecurityContext.SuppressFlowでは駄目で、ExecutionContext.SuppressFlowにする必要がありました。
最初にExecutionContextでうまくいったので、次にSecurityContextで試してこちらもうまくいったと思っていたのですが、確認方法のミスで実はうまくいってませんでした(ExecutionContextだとうまくいきます)。