我正在创建一个新的MVC 4网站,我已经设置了SimpleMembership。我还创建了一个CustomPrincipal,它继承自RolePrincipal并且有一个名为UserInfo的附加属性,其中包含有关用户的其他信息,如LastName,FirstName和IsActive。这些都通过FormsAuthenticationTicket userData属性存储在cookie中。
我的问题如下。假设我有一个管理页面,管理员用户可以禁用其他用户的帐户 - 将IsActive属性设置为false。假设同时被禁用的用户实际上当前已登录。我不希望该用户在被拒绝访问权限的情况下能够继续浏览该站点。
如何杀死他的会话意味着销毁他的FormsAuthentication cookie?这是正确的事情,还是SimpleMembership中还有其他东西我不知道?实现这项任务的正确途径是什么?任何建议将不胜感激......
答案 0 :(得分:3)
我建议结合使用Application_AuthenticateRequest和ASP.NET Cache,如下所示:
1)当用户被删除时,将用户ID写入ASP.NET Cache,它可以在一段有限的时间内(可能是一天)停留:
string cacheKey = "RecentlyDeletedUserId" + userId;
Cache.Add(
cacheKey,
true,
null,
DateTime.Now.AddDays(1),
null,
CacheItemPriority.Normal,
null
);
2)在global.asax中,您可以添加Application_AuthenticateRequest
处理程序,在服务器成功接收表单身份验证票证后,会为每个请求触发。在此处理程序中,您可以创建一个廉价的内存缓存请求,以查看该用户是否位于最近删除的用户列表中。如果是,则将其签名并将其重定向到登录页面。
protected void Application_AuthenticateRequest(object sender, EventArgs e) {
string cacheKey = "RecentlyDeletedUserId" + userId;
if (Cache[cacheKey] != null)
{
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();
}
}
如果由于某种原因你不喜欢重定向方法,你可以采取这样的方法:
protected void Application_AuthenticateRequest(object sender, EventArgs e) {
string cacheKey = "RecentlyDeletedUserId" + userId;
if (Cache[cacheKey] != null)
{
IPrincipal anonymousPrincipal = new GenericPrincipal(new GenericIdentity(String.Empty), null);
Thread.CurrentPrincipal = anonymousPrincipal;
HttpContext.Current.User = anonymousPrincipal;
}
}
这只是将用户替换为匿名用户,这可确保用户无法在您的网站上执行任何操作。 (这种替代方法来自Invalidating ASP.NET FormsAuthentication server side。)