2

コード例は、重要なビットに焦点を当てるために単純化されています。

3 つの MVC アプリケーションがあり、そのうちの 1 つは で実行されhttps://localhost/App/、他の 2 つはその下で実行されます (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またはで呼び出されることはありません。フィルタの設定は、またはの最初の実行でヒットしないようです。これは奇妙に思えます。App2iisresetAppApp1

セットアップは各アプリで同じで、すべて共通のクラスを使用します。HomeController各アプリの は、アクションでEntitleAttributeはなくコントローラーにあるため、一貫性があります。Index

AuthorizationAttribute と IAuthorizationFilter も使用してみましたが、同じ結果が得られました。どんな方向性でも大歓迎です。

4

0 に答える 0