我手动管理用户及其登录。我使用模型绑定器将登录用户作为参数传递给控制器。现在,一些控制器和方法使用Authorize
属性来限制访问,但授权null
而不是Account
个对象。
当删除帐户但用户仍然登录时,会出现这种情况。这是模型绑定器:
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
HttpCookie authCookie = controllerContext.HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
var authTicket = FormsAuthentication.Decrypt(authCookie.Value);
int userId = int.Parse(authTicket.UserData.Split(',')[0]);
var userRepository = DependencyResolver.Current.GetService(typeof(IUserRepository)) as IUserRepository;
return userRepository.FindById(userId) as Account;
}
return null;
}
存储库返回null,因为该帐户不再存在,但它仍然被授权。这是登录:
private void LoginUser(Account account, bool remeberMe)
{
string role = ObjectContext.GetObjectType(account.GetType()).Name;
String userData = account.UserId + "," + role;
//clear any other tickets that are already in the response
Response.Cookies.Clear();
DateTime expiryDate = DateTime.Now.AddDays(30);
//create the FAT
var authenticationTicket = new FormsAuthenticationTicket(1, account.FirstName, DateTime.Now,
expiryDate, remeberMe, userData, string.Empty);
//create cookie
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName,
FormsAuthentication.Encrypt(authenticationTicket));
if (remeberMe)
{
cookie.Expires = expiryDate;
}
//finish
Response.Cookies.Add(cookie);
HttpContext.User = new GenericPrincipal(new GenericIdentity(account.FullName),
new[] { role });
}
我认为它仍然被授权,因为仍然设置了HttpContext.User。什么是重置HttpContext.User并删除已删除用户的cookie的最佳方法?
答案 0 :(得分:1)
如果您使用基于角色的身份验证,那么处理它的最优雅方式是撤消用户的角色。他们仍然会登录,但无法访问特权信息。
否则,您必须创建一个已删除的标志并创建某种操作过滤器,自定义授权属性或为每个请求检查它的方法,并在此检查失败时手动将其注销。
如果您正在使用新的ASP.NET身份(看起来好像不是并且正在使用自定义表单身份验证),您实际上可以重新生成安全戳,因为它使用它来确定用户的凭据是否具有每个请求都改变了。