从 AuthorizeAttribute 继承的属性不起作用
Attribute inheriting from AuthorizeAttribute not working
我目前正在尝试根据用户角色在新的 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);
}
}
我在方法 and/or 控制器上这样称呼它:
[AuthorizeRoleOrSuperior(MyAppRole.Admin)]
public class MyController : Controller
{
[AuthorizeRoleOrSuperior(MyAppRole.Admin)]
public ViewResult Index()
{
[...]
}
[...]
}
我在构造函数和 OnAuthorization 方法上放置了一个断点,但是,当我启动应用程序并调用相关的控制器或方法时,我从未点击过它们中的任何一个并调用了操作,即使我什至没有已登录。
注意:AuthorizeAttribute 在我使用时正常工作。
知道什么可以阻止属性工作和过滤访问吗?
您是否继承了 System.Web.Http.AuthorizeAttribute 的属性?它的工作方式不同于 System.Web.Mvc.AuthorizeAttribute.
尝试从 System.Web.Mvc.AuthorizeAttribute 继承。
[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)
您还可以设置 filterContext.Result = new HttpUnauthorizedResult();
以获得正确的 401 http 状态代码。
我目前正在尝试根据用户角色在新的 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);
}
}
我在方法 and/or 控制器上这样称呼它:
[AuthorizeRoleOrSuperior(MyAppRole.Admin)]
public class MyController : Controller
{
[AuthorizeRoleOrSuperior(MyAppRole.Admin)]
public ViewResult Index()
{
[...]
}
[...]
}
我在构造函数和 OnAuthorization 方法上放置了一个断点,但是,当我启动应用程序并调用相关的控制器或方法时,我从未点击过它们中的任何一个并调用了操作,即使我什至没有已登录。
注意:AuthorizeAttribute 在我使用时正常工作。
知道什么可以阻止属性工作和过滤访问吗?
您是否继承了 System.Web.Http.AuthorizeAttribute 的属性?它的工作方式不同于 System.Web.Mvc.AuthorizeAttribute.
尝试从 System.Web.Mvc.AuthorizeAttribute 继承。
[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)
您还可以设置 filterContext.Result = new HttpUnauthorizedResult();
以获得正确的 401 http 状态代码。