CurrentUser自定义标识和属性

时间:2013-12-17 00:53:01

标签: c# asp.net-mvc forms-authentication

重新审核问题

我有一个使用表单身份验证的ASP.NET MVC 4站点。 它还需要从服务调用中检索自定义用户对象,然后将其设置为HttpCurrent.User.Context。

这个工作正常,但我意识到,当它点击后验证请求它会按照请求多次点击它 - 不好。

的Global.asax.cs:

 protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
        {
            if (User.Identity.IsAuthenticated)
            {
               IIdentity ui = HttpContext.Current.User.Identity;
               MyMembershipUser myUser = new MyMembershipUser (ui.Name);
               MyCustomPrincipal myPrincipal = new MyCustomPrincipal (ui, myUser);
               HttpContext.Current.User = myPrincipal;
            }
        }

由于多种原因,我无法完全缓存用户,所以不要去那里。

因此每次请求会执行几次。这意味着每次点击都会调用数据库。

站点上的某些视图使用自定义主体仅在经过身份验证时才显示某些特定于用户的详细信息。如果他们不是,那么它不会显示它。但是如果它们经过身份验证,它会获得主体并将其转换为“MyCustomPrincipal”,这样我就可以获取需要显示的属性。

如何防止这些多次点击?

我尝试创建一个自定义Authorize属性并在那里执行上面的代码,但是当它呈现可以看到用户已经过身份验证但无法执行强制转换的视图时它会工作但失败,因为此时,用户身份/主体仍然设置为Generic主体。

视图中的典型代码:

@if (Helpers.UserContext.IsAuthenticated)
{
   @: tmpStatus = '@Helpers.UserContext.User.Status';
}

UserContext.IsAuthenticated只返回HttpContext.Current.User.Identity.IsAuthenticated

UserContext中的用户执行转换:

return HttpContext.Current.User as MyCustomPrincipal

我希望这更能澄清这个问题!

我想避免在PostAuthenticateRequest上发生多次点击,但不确定为什么会发生这些点击。我甚至不确定它是否适合放置它。我想确保Context User全部设置为后续访问/请求,而不必再调用服务层来获取详细信息。

感谢

1 个答案:

答案 0 :(得分:0)

通过检查验证是否最小化某些操作

//assuming something like.... 
       public override void Init() {
        base.Init();

        // handlers managed by ASP.Net during Forms authentication

        PostAuthorizeRequest += new EventHandler(PostAuthHandler);

    }

// try screen out some calls that arent authenticated yet.
public void PostAuthHandler(object sender, EventArgs e) {
         if (Request.IsAuthenticated) {
         //.... try a break to see how often 
         }
    }

编辑:但由于脚本和内容捆绑/加载,请注意多次点击。

检查Request.Url值。它在变化吗?   另请注意线程ID。请参见Debug.Windows.Threads
  线程也可能正在改变   在尝试任何缓存/全局单例等之前,请考虑线程安全性。

您可能希望考虑将一些代码移动到控制器或基本控制器