ASP.net アプリケーションでは、私が作成したカスタム メンバーシップ プロバイダーで Login コントロールを使用しています。私がやりたいことはThread.CurrentPrincipal
、ユーザーが認証された直後に、カスタム プリンシパル オブジェクトに設定することです。
私はセッターを使用しています。Thread.CurrentPrincipal
それは私のためにプリンシパルオブジェクトを設定しますが、すべての後続スレッドで、この CurrentPrincipal はデフォルトのものでオーバーライドされます。
ログイン コントロールの Authenticate イベントのコードは次のとおりです。
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
string username = Login1.UserName;
string password = Login1.Password;
if (Membership.ValidateUser(username, password))
{
var login = sender as Login;
var phoenixIdentity = new PhoenixIdentity("B", "Forms" , true);
var principal = new PhoenixPrincipal(phoenixIdentity);
Thread.CurrentPrincipal = principal;
AppDomain.CurrentDomain.SetThreadPrincipal(principal);
HttpContext.Current.User = principal;
e.Authenticated = true;
}
}
たとえば、ユーザー名 A でログインすると、すべてがうまくいくと想像してください... 検証はパスしますが、オブジェクトとして設定したプリンシパル オブジェクトに設定された Identity オブジェクトで、ユーザー名 B を使用してユーザーをハードコードしCurrentPrincipal
ます。
このメソッドの最後でどのユーザーがCurrentPrincipal
ID に設定されているかを確認すると、それはユーザー B であるCurrentPrincipal
と表示されます。
CurrentPrincipal
では、オブジェクトを他のすべてのスレッドで永続化するにはどうすればよいですか? また、このログイン コントロールはいつどこでCurrentPrincipal
スレッドのオブジェクトを設定するのでしょうか?