【发布时间】:2018-08-16 21:56:06
【问题描述】:
我基于[Authorize] 属性实现了[CustomAuthorization] 属性。我的属性如下所示:
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public eUserRole CustomRoles { get; set; } = eUserRole.Administrator; // If not specified, the required role is Administrator
protected override bool IsAuthorized(HttpActionContext actionContext)
{
AuthorizationSystem auth = new AuthorizationSystem(actionContext.RequestContext.Principal, this.CopyleaksRoles);
var res = auth.Validate();
if (!res)
return false;
return base.IsAuthorized(actionContext);
}
}
我将逻辑(谁接受谁不接受)拆分为单独的类。如果用户根据其CustomRoles 属性被接受,则AuthorizationSystem.Validate() 方法返回true。
我的控制器看起来像:
[CustomAuthorize]
public class MyController : ApiController
{
[CustomAuthorize(CustomRoles = eUserRole.Readonly)]
public Response Do()
{
// ... Do something ...
}
}
我正在运行应用程序(C# + WebAPI)来检查它是否工作。
我调试代码并发现在第一次运行时,所需的最低角色级别是Administrator,而不是Readonly。因为当使用[CustomAuthorize] 而没有任何CustomRoles 时,它会将default 行定义为eUserRole.Administrator。这意味着被调用的第一个CustomAuthorize 属性是类级别的属性,不是方法级别的。
如何让它调用之前方法(Do())上的属性?
【问题讨论】:
-
拥有一个具有最低管理员访问权限的控制器似乎有点奇怪,但该控制器的方法具有最低只读权限。你的逻辑自相矛盾。
标签: c# asp.net asp.net-web-api oauth owin