【发布时间】:2009-08-31 08:32:41
【问题描述】:
在一个 ASP.net 应用程序中,我正在使用带有我编写的自定义成员资格提供程序的登录控件。我要做的是在用户通过身份验证后将Thread.CurrentPrincipal 设置为我的自定义主体对象。
我正在使用 setter:Thread.CurrentPrincipal,它为我设置了 Principal 对象,但是在所有后续线程上,此 CurrentPrincipal 被默认值覆盖。
这是我的登录控件的身份验证事件的代码:
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 对用户进行硬编码,该对象设置为我设置为 @987654324 的 Principal 对象@对象。
当我在此方法的末尾检查哪个用户设置为 CurrentPrincipal 身份时,它说它是用户 B。但是当我加载另一个页面然后检查 CurrentPrincipal 的身份时,它说它是用户 A。
那么,我怎样才能使我的CurrentPrincipal 对象在所有其他线程中保持不变,以及此登录控件在何处/何时设置线程的CurrentPrincipal 对象?
【问题讨论】:
-
你在做什么?您希望每个人都被识别为第一个登录用户吗?您需要了解 Web 应用程序的认证和授权机制、cookie 的使用等。您不能将一个主体设置为所有多用户应用程序线程。
-
当然不是。可能我表达的不够清楚。
标签: asp.net authentication identity principal