授权(角色="Admin")不起作用

Authorize(Roles="Admin") does not work

我正在编写 ASP.NET 应用程序,使用 Identity 作为授权引擎。我编写了自定义用户和角色存储,它们似乎工作正常。但是,由于某些未知原因,尝试对控制器的操作使用 Authorize with role 失败并重定向到 Home/Index。该操作如下所示:

[Authorize(Roles = "Admin")]
public ActionResult Manage()
{
    return View();
}

重定向是静默进行的,所以我无法在任何地方挂钩调试器(尤其是在 运行 动作之前进行动作过滤)。

我想这可能不足以诊断问题,所以请在评论中告诉我,您还需要什么其他信息,我会编辑问题。

为什么不起作用?


编辑:Startup.cs

中的配置
    public void Configuration(IAppBuilder app)
    {
        DataProtectionProvider = app.GetDataProtectionProvider();

        app.CreatePerOwinContext<ApplicationUserManager>(() => DependencyResolver.Current.GetService<ApplicationUserManager>());

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = "ApplicationCookie",
            LoginPath = new PathString("/Account/Login")
        });            
    }

编辑:另一个动作:

    [AllowAnonymous]
    public async Task<ActionResult> Index()
    {
        // This returns FALSE
        if (User.IsInRole("Admin"))
            System.Diagnostics.Debug.WriteLine("Ok");

        var userManager = UnityConfig.Container.Resolve<ApplicationUserManager>();
        // This returns TRUE
        if (await userManager.IsInRoleAsync(User.Identity.GetUserId<int>(), "Admin"))
            System.Diagnostics.Debug.WriteLine("Ok");

        return View();
    }

需要检查的几件事:

  1. 登录页面设置成什么?我猜你要么未经身份验证要么未经授权,MVC 将你发送到登录页面(可能设置或默认为“/”
  2. 如果您确定已登录(已通过身份验证),请仔细检查您的用户是否确实具有管理员角色(已授权)。
  3. 我相信用户存储有一个方法,您可以重写该方法以查看为用户角色返回的内容。可能值得在那里设置一个断点,看看发生了什么。