在哪里创建自定义IPrincipal对象?

我在global.asax中使用Application_PostAuthenticateRequest事件来创建自定义IPrincipal对象

void Application_PostAuthenticateRequest(object sender, EventArgs args)
{
    if (Context.User.Identity.IsAuthenticated == true)
        if (Context.User.Identity.AuthenticationType == "Forms")
        {                 
              Context.User = new CustomPrincipal(Context.User);
              Thread.CurrentPrincipal = Context.User;
        }                
}

在我的应用程序中使用,我想获得更多关于登录用户的信息。 我认为这将被称为一次,当用户身份验证,但我注意到,它被调用每个页面请求几次相同的登录用户。 我发现即使是从AppThemes请求图片也会调用这种方法!

我应该在哪里创建该对象,以避免为每个用户多次调用此方法?


我找到了我的问题的答案。

在loggin_in事件中,我应该保存身份验证cookie(我可以将以后需要的所有信息存储在我的customPrincipal中的UserData属性中),并且在Application_PostAuthenticateRequest中,我应该从该cookie创建CustomPrincipal。 这样的事件触发每一个请求,但我不打数据库 - 我从cookie读取数据。

我遵循http://www.ondotnet.com/pub/a/dotnet/2004/02/02/effectiveformsauth.html

在我的情况下代码是:

void Application_PostAuthenticateRequest(object sender, EventArgs args)
    {
        HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
        if (authCookie == null)
            return;
        FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
        string[] customData = authTicket.UserData.Split(new Char[] { '|' });

        if (Context.User.Identity.IsAuthenticated == true)
        {
            if (Context.User.Identity.AuthenticationType == "Forms")
            {
                Context.User = new CustomPrincipal(customData, Context.User);
                Thread.CurrentPrincipal = Context.User;
            }
        }
}

Context.User不会跨请求保存新的主体; 您必须在每个请求上创建自定义委托人。 所以最好在这里留下这段代码。 否则,它将恢复到FormsPrincipal或WindowsPrincipal,具体取决于应用程序身份验证模式。

HTH,

布赖恩

链接地址: http://www.djcxy.com/p/48157.html

上一篇: Where to create custom IPrincipal object?

下一篇: MVC2 :: How do I *USE* a Custom IIdentity Class?