在ASP.net应用程序中,我使用具有我编写的自定义成员资格提供程序的Login控件。我想做的就是在用户通过身份验证之后,将Thread.CurrentPrincipal设置为我的自定义Principal对象。

我使用的是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对象的Principal对象。

当我在此方法末尾检查哪个用户设置为CurrentPrincipal身份时,它说的是用户B。但是当我加载另一个页面然后检查CurrentPrincipal的身份是什么时,它说的是用户A。

因此,如何使CurrentPrincipal对象在所有其他线程上保持不变,以及此Login控件在何处/何时设置线程的CurrentPrincipal对象?

最佳答案

您可以处理FormsAuthentication_OnAuthenticate(Object sender,FormsAuthenticationEventArgs e)(在Global.asax中)并在此处设置CurrentPrincipal。


void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs e)
{
var phoenixIdentity = new PhoenixIdentity("B", "Forms" , true);
var principal = new PhoenixPrincipal(phoenixIdentity);
e.User = principal;
}

关于asp.net - 如何设置Thread.CurrentPrincipal在整个应用程序中使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1356449/

10-12 21:41