gpt4 book ai didi

c# - 从 AuthorizeAttribute 继承的属性不起作用

转载 作者:太空狗 更新时间:2023-10-30 00:38:27 24 4
gpt4 key购买 nike

我目前正在尝试根据用户角色在新的 ASP MVC 5 应用程序中实现安全性。目标是防止用户在没有特定角色(或更高级别)的情况下访问某些 Controller 或 Controller 方法。根据到目前为止我对这个问题的阅读,我创建了一个继承 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);
}
}

我在方法和/或 Controller 上这样调用它:

[AuthorizeRoleOrSuperior(MyAppRole.Admin)]
public class MyController : Controller
{
[AuthorizeRoleOrSuperior(MyAppRole.Admin)]
public ViewResult Index()
{
[...]
}

[...]
}

我在构造函数和 OnAuthorization 方法上放置了一个断点,但是当我启动应用程序并调用相关的 Controller 或方法时,我从未点击过它们中的任何一个并且调用了操作,即使我什至没有登录.

注意: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 状态代码。

关于c# - 从 AuthorizeAttribute 继承的属性不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41121851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com