ASP.NET MVC5 VS2017角色授权失败

时间:2017-07-19 04:07:30

标签: c# asp.net asp.net-mvc authorize-attribute

我无法在VS2017社区的ASP.NET MVC5 SPA中使用一些简单的基于角色的安全性。

这是我的控制器的顶部:

namespace ManagementWebSite.Controllers
{
    [Authorize(Roles = "Administrator")]
    public class SystemManagementController : ApiController

控制器工作正常,没有Authorize属性,但我想将其锁定为管理员应用程序角色。我在Startup.cs中将角色添加到我的test@test.com用户:

    void ConfigureRolesandUsers()
    {
        ApplicationDbContext context = new ApplicationDbContext();
        var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
        var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));

        if (!roleManager.RoleExists("Administrator"))
        {
            var role = new IdentityRole();
            role.Name = "Administrator";
            roleManager.Create(role);

            var user = userManager.FindByEmail("test@test.com");
            if (user != null)
            {
                if (user.Roles.Where(b => b.RoleId == role.Id).Count() == 0)
                {
                    userManager.AddToRole(user.Id, "Administrator");
                }
            }
        }
    }

似乎在登录时获得角色声明,但是,如果我以test@test.com身份登录并尝试在浏览器中使用控制器,我会获得401 Unauthorized,我不知道为什么因为用户已经管理员角色,并在登录时获得声明。

注销并重新登录,重新启动VS,删除(以及稍后重新添加)RoleManager模块不起作用。

所以我接下来尝试的是继承AuthorizeAttribute,如下所示:

public class RoleAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);
    }

    protected override HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext)
    {
        return base.OnCacheAuthorization(httpContext);
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return base.AuthorizeCore(httpContext);
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        base.HandleUnauthorizedRequest(filterContext);
    }
}

并在每个方法上设置断点。在尝试调试时没有任何断点被击中,但现在应用程序允许它通过,所以我想知道发生了什么,以及它是否正确地检查角色应该如此。当我需要查看控制器动作上游的内容时,如何进行调试?好像单独的AuthorizeAttribute只能在没有子类化的情况下工作,因为它有一个Roles属性可以使用,是不是这样呢?

0 个答案:

没有答案