已登录合法用户时,Authorize特性为何无法授权Action?
我看了你的代码,问题出在你对AuthorizeAttribute的使用理解上,咱们一步步理清楚:
核心问题:手动实例化的AuthorizeAttribute完全没用
你在登录代码里新建的AuthorizeAttribute对象,只是一个普通的C#实例,根本不会被ASP.NET框架用来做授权检查。框架只会读取你在GetServices Action上声明的那个[Authorize(Users="admin")]特性的配置,你后面手动设置的aattr.Users对授权逻辑没有任何影响。
为什么授权失败?
你的Action上硬编码了Users="admin",这意味着只有用户名严格等于"admin"的用户才能访问这个接口。现在你需要确认两个点:
- 登录时的
usersModels.UserName是不是确实等于"admin"?如果不是,那授权肯定会失败。 - 你调用
FormsAuthentication.SetAuthCookie时传入的用户名是否正确?框架的AuthorizeAttribute是从这个认证Cookie里取用户名做校验的,和你设置的Session["UHTUserName"]或者Session["Users"]没关系(Session是会话存储,不是授权认证的依据)。
正确的处理方式
场景1:确实只允许admin用户访问
那你只需要确保登录用户的用户名是"admin",并且保留Action上的特性即可,登录代码里不需要手动创建AuthorizeAttribute:
// 登录代码,确保usersModels.UserName是"admin" Session["Users"] = usersModels; Session["UHTUserName"] = usersModels.UserName; // 这里传入的用户名要和Authorize里的Users匹配 FormsAuthentication.SetAuthCookie(usersModels.UserName, LoginVM.RememberMe);
场景2:需要动态控制授权用户(比如按角色)
如果你的需求不是固定只允许admin,而是根据用户角色授权,建议改用角色授权:
- 修改Action上的特性:
[Authorize(Roles = "Admin")] // 用角色代替固定用户名 [HttpGet] public JsonResult GetServices() { return Json(ServicesRepository.SelectServices(), JsonRequestBehavior.AllowGet); }
- 登录时给用户添加角色(需要在Forms认证票据里存储角色信息):
// 创建包含角色的认证票据 var authTicket = new FormsAuthenticationTicket( 1, usersModels.UserName, DateTime.Now, DateTime.Now.AddMinutes(30), LoginVM.RememberMe, "Admin" // 这里存储角色 ); // 加密票据并写入Cookie string encryptedTicket = FormsAuthentication.Encrypt(authTicket); HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); Response.Cookies.Add(authCookie); // 同时设置Session(如果需要的话) Session["Users"] = usersModels; Session["UHTUserName"] = usersModels.UserName;
这样框架的AuthorizeAttribute就会自动检查用户是否属于Admin角色,而不是固定的用户名。
内容的提问来源于stack exchange,提问作者user9677867
相关产品推荐
相关产品推荐

