当前用户自定义标识和属性
本文关键字:标识 属性 自定义 用户自定 用户 | 更新日期: 2024-10-26 07:42:36
重写的问题
我有一个使用表单身份验证的 ASP.NET MVC 4 站点。它还需要从服务调用中检索自定义用户对象,然后将其设置为 HttpCurrent.User.Context。
这工作正常,但我意识到当它命中 post 身份验证请求时,每个请求都会命中几次 - 不好。
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;
}
}
由于多种原因,我无法完全缓存用户,所以我们不要去那里。
因此,每个请求都会执行几次。这意味着对于每次点击,它都会调用 DB。
站点上的某些视图仅当某些用户特定的详细信息经过身份验证时才使用自定义主体来显示这些详细信息。 如果不是,则不会显示它。但是,如果它们经过身份验证,它将获取主体并将其强制转换为"MyCustomPrincipal",以便我可以获取需要显示的属性。
如何防止这些多次命中?
我尝试创建自定义授权属性并在那里执行上述代码,它可以工作,但在呈现可以看到用户已通过身份验证但无法执行强制转换的视图时失败,因为此时,用户身份/主体仍设置为通用主体。
视图中的典型代码:
@if (Helpers.UserContext.IsAuthenticated)
{
@: tmpStatus = '@Helpers.UserContext.User.Status';
}
UserContext.IsAuthenticated 只返回 HttpContext.Current.User.Identity.IsAuthenticated
用户上下文中的用户执行强制转换:
return HttpContext.Current.User as MyCustomPrincipal
我希望这能进一步澄清这个问题!
我想避免在PostAuthenticateRequest上发生多次点击,但不确定为什么会发生这些点击。我什至不确定它是否是放置它的正确位置。我想确保上下文用户已全部设置为后续访问/请求,而无需调用服务层来再次获取详细信息。
谢谢
您可以通过检查是否经过身份验证来最小化某些操作
//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
线程也可能正在更改。
在尝试任何缓存/全局单例等之前,请考虑线程安全性。
您可能希望考虑将一些代码移动到控制器或基本控制器