我目前正在尝试基于用户角色在新的ASP MVC 5应用程序中实现安全性。目标是防止用户访问某些控制器或控制器方法,如果他们没有某个角色(或更高)。基于我到目前为止所读到的问题,我创建了一个继承AuthorizeAttribute的属性,看起来像这样(MyAppRole是一个枚举,顺便说一下):
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class AuthorizeRoleOrSuperiorAttribute : AuthorizeAttribute
{
private MyAppRole _authorizedRole;
public AuthorizeRoleOrSuperiorAttribute(MyAppRole authorizedRole)
{ //Breakpoint here
_authorizedRole = authorizedRole;
}
public override void OnAuthorization(HttpActionContext actionContext)
{ //Breakpoint here
base.OnAuthorization(actionContext);
if (!UserInfo.GetUserRoles().Any(r => (int)r >= (int)_authorizedRole))
throw new UnauthorizedAccessException(ErrorsModule.RoleMissing);
}
}
我在方法和/或控制器上这样称呼它:
[AuthorizeRoleOrSuperior(MyAppRole.Admin)]
public class MyController : Controller
{
[AuthorizeRoleOrSuperior(MyAppRole.Admin)]
public ViewResult Index()
{
[...]
}
[...]
}
我在构造函数和OnAuthorization方法上放置了一个断点但是,当我启动应用程序并调用相关的控制器或方法时,我从未点击任何一个并且操作被调用,即使我甚至没有登录
注意:AuthorizeAttribute在我使用时正常工作。
知道什么可能阻止该属性工作并过滤访问?
答案 0 :(得分:7)
您是否从System.Web.Http.AuthorizeAttribute继承该属性?它的工作方式与System.Web.Mvc.AuthorizeAttribute不同。
尝试继承System.Web.Mvc.AuthorizeAttribute。
"SELECT [reg_grade], [t_name], [start_time], [end_time] from addteacher where class_id='" + ...
至少应该让你达到断点。
注意参数差异:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class AuthorizeRoleOrSuperiorAttribute : System.Web.Mvc.AuthorizeAttribute
{
private MyAppRole _authorizedRole;
public AuthorizeRoleOrSuperiorAttribute(MyAppRole authorizedRole)
{ //Breakpoint here
_authorizedRole = authorizedRole;
}
public override void OnAuthorization(AuthorizationContext filterContext)
{ //Breakpoint here
base.OnAuthorization(filterContext);
if (!UserInfo.GetUserRoles().Any(r => (int)r >= (int)_authorizedRole))
throw new UnauthorizedAccessException(ErrorsModule.RoleMissing);
}
}
和
OnAuthorization(AuthorizationContext filterContext)
您还可以设置public override void OnAuthorization(HttpActionContext actionContext)
以获取正确的401 http状态代码。