授权属性授权null

时间:2015-06-19 13:49:42

标签: .net asp.net-mvc

我手动管理用户及其登录。我使用模型绑定器将登录用户作为参数传递给控制器​​。现在,一些控制器和方法使用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的最佳方法?

1 个答案:

答案 0 :(得分:1)

如果您使用基于角色的身份验证,那么处理它的最优雅方式是撤消用户的角色。他们仍然会登录,但无法访问特权信息。

否则,您必须创建一个已删除的标志并创建某种操作过滤器,自定义授权属性或为每个请求检查它的方法,并在此检查失败时手动将其注销。

如果您正在使用新的ASP.NET身份(看起来好像不是并且正在使用自定义表单身份验证),您实际上可以重新生成安全戳,因为它使用它来确定用户的凭据是否具有每个请求都改变了。