コード例は、重要なビットに焦点を当てるために単純化されています。
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
またはで呼び出されることはありません。フィルタの設定は、またはの最初の実行でヒットしないようです。これは奇妙に思えます。App2
iisreset
App
App1
セットアップは各アプリで同じで、すべて共通のクラスを使用します。HomeController
各アプリの は、アクションでEntitleAttribute
はなくコントローラーにあるため、一貫性があります。Index
AuthorizationAttribute と IAuthorizationFilter も使用してみましたが、同じ結果が得られました。どんな方向性でも大歓迎です。