我无法在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属性可以使用,是不是这样呢?