【问题标题】:Authorize(Roles="Admin") does not work授权(角色=“管理员”)不起作用
【发布时间】:2016-01-16 19:16:33
【问题描述】:

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

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

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

我想这可能不足以诊断问题,所以只需在 cmets 中告诉我,您需要哪些额外信息,我会编辑问题。

为什么它不起作用?


编辑: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();
    }

【问题讨论】:

  • 首先,删除该属性并验证您是否正确地转到管理。授权失败应该将您发送到登录,而不是主页/索引
  • 这是支持 OWIN 的应用程序吗?如果是这样,你能显示你的授权配置吗?
  • @HenkHolterman 是的,如果我将[Authorize] 替换为[AllowAnonymous],它可以正常工作
  • @TiesonT。我对OWIN很陌生,Startup.cs中的Configuration方法是你指的方法吗?
  • @Spook 如果您遵循通用模板,是的(您的编辑看起来就是这种情况)。

标签: c# asp.net asp.net-mvc asp.net-identity


【解决方案1】:

需要检查的几件事:

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

【讨论】:

  • 关于 3.,我在 GetUserRolesIsUserInRole 都设置了一个断点,但都没有运行
  • 那么我敢打赌你实际上并没有登录。创建另一个返回新的控制器方法(称之为“UserInfo”或其他东西并检查你的用户信息,比如@(User.Identity .IsAuthenticated ? "Logged in" : "Not logged in") (或者只是检查调试器)。你是如何登录的?
  • 我猜你是在正确的轨道上。我登录,但这是通过 cookie 登录的 - 我在向用户添加角色之前登录。当我注销然后登录时,立即调用了GetRolesForUser,现在所有具有角色的[Authorize] 都可以工作。
  • 这是否意味着仅在登录期间检查角色?并且 [Authorize] 过滤器不检查 当前 用户角色?
  • 是的 - 角色将被存储(加密)在 cookie/token 中,因此您必须在更改角色后重新登录。
猜你喜欢
  • 2020-05-27
  • 2011-10-24
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 2015-07-31
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多