代码示例被简化以专注于重要的位。
我有三个 MVC 应用程序,其中一个https://localhost/App/
运行在它下面,另外两个在它下面运行(https://localhost/App/App1/
和https://localhost/App/App2/
)。到目前为止,我一直在使用派生自 的属性授权用户ActionFilterAttribute
,并且效果很好。工作属性如下所示:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class EntitleAttribute : ActionFilterAttribute
{
public string PermissionName { get; private set; }
public EntitleAttribute(string permissionName = null)
{
PermissionName = permissionName;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
bool hasPermission = IsAccessibleInCurrentContext();
if (!hasPermission)
{
// If the user does not have rights on this action, return a 401.
filterContext.Result = new HttpUnauthorizedResult();
}
}
}
但是,我最近已转换为使用 Ninject,并且正在尝试将其转换为 Action+Filter 设置,以便可以注入到过滤器中。所以现在,为了声明用户访问操作所需的授权,我设置了一个属性,如下所示:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class EntitleAttribute : Attribute
{
public string PermissionName { get; private set; }
public EntitleAttribute(string permissionName = null)
{
PermissionName = permissionName;
}
}
我有一个像这样设置的过滤器:
public class EntitleFilter : IActionFilter
{
private readonly string _permissionName;
public EntitleFilter(string permissionName)
{
_permissionName = permissionName;
}
public void OnActionExecuting(ActionExecutingContext filterContext)
{
bool hasPermission = IsAccessibleInCurrentContext();
if (!hasPermission)
{
// If the user does not have rights on this action, return a 401.
filterContext.Result = new HttpUnauthorizedResult();
}
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
// Nothing.
}
}
我像这样设置依赖注入NinjectModule
:
// Bind authorization handling.
this.BindFilter<EntitleFilter>(FilterScope.Controller, 0)
.WhenControllerHas<EntitleAttribute>()
.WithConstructorArgumentFromControllerAttribute<EntitleAttribute>("permissionName", attr => attr.PermissionName);
this.BindFilter<EntitleFilter>(FilterScope.Action, 0)
.WhenActionMethodHas<EntitleAttribute>()
.WithConstructorArgumentFromActionAttribute<EntitleAttribute>("permissionName", attr => attr.PermissionName);
当我跑步时App
,一切都很好——OnActionExecuting
每次调用都会触发该方法。但是,该方法永远不会在App1
or中被调用App2
,即使在iisreset
. 过滤器设置似乎在第一次运行App
orApp1
时没有受到影响,这似乎很奇怪。
每个应用程序的设置都是相同的,都使用通用类。每个HomeController
应用程序中都有EntitleAttribute
控制器而不是Index
动作,所以这是一致的。
我也尝试过使用 AuthorizationAttribute 和 IAuthorizationFilter,结果相同。任何方向将不胜感激。