在ASP.net应用我使用的是,我写了一个自定义的成员提供一个登录控制。我想要做的是设置Thread.CurrentPrincipal
到我的自定义Principal对象,用户通过身份验证之后。如何设置Thread.CurrentPrincipal以供整个应用程序使用?
我使用setter:Thread.CurrentPrincipal
它为我设置Principal对象,但在所有后续线程上,此CurrentPrincipal被默认值覆盖。
这里是我的Login控件的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
身份时,它表示它是用户B.但是,当我加载另一个页面,然后检查CurrentPrincipal
的身份是什么时,它表示它是用户A.
那么,如何让我的CurrentPrincipal
对象在所有其他线程中保持不变,以及此Login控件设置线程的CurrentPrincipal
对象的位置/时间?
你在做什么?你希望每个人都被识别为第一个登录用户吗?您需要了解Web应用程序身份验证和授权的机制,使用Cookie等。您无法将一个主体设置为所有多用户应用程序线程。 – 2009-08-31 09:03:18
当然不是。也许我没有足够清楚地表达自己。 – Goran 2009-08-31 10:05:50