2

代码示例被简化以专注于重要的位。

我有三个 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每次调用都会触发该方法。但是,该方法永远不会在App1or中被调用App2,即使在iisreset. 过滤器设置似乎在第一次运行ApporApp1时没有受到影响,这似乎很奇怪。

每个应用程序的设置都是相同的,都使用通用类。每个HomeController应用程序中都有EntitleAttribute控制器而不是Index动作,所以这是一致的。

我也尝试过使用 AuthorizationAttribute 和 IAuthorizationFilter,结果相同。任何方向将不胜感激。

4

0 回答 0