加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 如何设置Thread.CurrentPrincipal以在整个应用程序中

发布时间:2020-12-15 19:55:24 所属栏目:asp.Net 来源:网络整理
导读:在ASP.net应用程序中,我正在使用我编写的自定义成员资格提供程序的Login控件.我想要做的是在用户通过身份验证后将Thread.CurrentPrincipal设置为我的自定义Principal对象. 我正在使用setter:Thread.CurrentPrincipal,它为我设置了Principal对象,但是在所有
在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 Identity时,它表示它是用户B.但是当我加载另一个页面然后检查CurrentPrincipal的标识是什么时,它表示它是用户A.

那么,如何让我的CurrentPrincipal对象在所有其他线程中保持持久性,以及此Login控件何时/何时设置Thread的CurrentPrincipal对象?

解决方法

您可以处理FormsAuthentication_OnAuthenticate(对象发送者,FormsAuthenticationEventArgs e)(在Global.asax中)并在此处设置CurrentPrincipal.
void FormsAuthentication_OnAuthenticate(object sender,FormsAuthenticationEventArgs e)
{
var phoenixIdentity = new PhoenixIdentity("B",true);
var principal = new PhoenixPrincipal(phoenixIdentity);
e.User = principal;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读