授权属性不适用于角色

本文关键字:角色 适用于 不适用 属性 授权 | 更新日期: 2023-09-27 18:31:16

我在获取Authorize属性以使用角色时遇到问题。这是我装饰控制器的方式:

[Authorize(Roles = "admin")]
public ActionResult Index()
{
    ...
}

这就是我登录用户的方式:

string roles = "admin";
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
    1,
    username,
    DateTime.Now,
    DateTime.Now.AddMinutes(30),
    false,
    roles
);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(authTicket));
HttpContext.Current.Response.Cookies.Add(cookie);

但我的用户仍然被拒绝访问。我哪里出错了?

授权属性不适用于角色

我偶然发现了您的代码的一个类似示例:MVC 的最高投票答案 - 如何存储/分配经过身份验证的用户的角色。

AuthorizeAttribute 在存储在 HttpContext.User 中的 IPrincipal 实例上调用 IsInRole 方法。默认情况下,IPrincipal 没有角色,在这种情况下,IsInRole 将始终返回 false。这就是拒绝访问您的操作的原因。

由于您已将用户的角色存储到 FormsAuthenticationTicket 的 UserData 属性中,因此您必须自己从身份验证 cookie 中提取角色并提取到 IPrincipal 实例中。MVC 的最高票答案 - 如何存储/分配经过身份验证的用户的角色提供了可以直接添加到 global.asax.cs 文件中的代码来执行此操作。我在下面重复了一遍:

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
    if (authCookie != null)
    {
      FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
      string[] roles = authTicket.UserData.Split(',');
      GenericPrincipal userPrincipal = new GenericPrincipal(new GenericIdentity(authTicket.Name), roles);
      Context.User = userPrincipal;
    }
}