2

私は少し壁にぶつかり、誰かが私が間違っているところを指摘してくれることを望んでいました。

Ninjectを使用してカスタムActionFilterAttributesに注入してきましたが、これは正常に機能しています。

kernel.BindFilter<CriticalErrorAttribute>(FilterScope.Last, 1);

現在、カスタムのAuthorizeAttributeに挿入しようとしています。構文が正しいので、Role属性とカスタム属性を挿入します。

kernel.BindFilter<Authorisation>(FilterScope.Action, 0)
.WhenActionMethodHas<Authorisation>()
.WithPropertyValueFromActionAttribute<Authorisation>("Roles", n => n.Roles)
.WithPropertyValueFromActionAttribute<Authorisation>("Years", n => n.Years);

属性は正しく実行されており、ロールと年は正常に挿入されています。私の問題は、注入しようとしているサービスが常にnullであるということです。

[Inject]
public IUserServices userService { get; set; }

通常のActionFilterAttributesでは、サービスは正常に注入されますが、ここではそうではありません。

どんな助けでもいただければ幸いです

4

2 に答える 2

3

属性から派生する代わりに、対応するインターフェースを実装する必要があります。たとえばIAuthorizationFilter、またはIActionFilter別の通常の属性を使用して、そのフィルターを適用するコントローラーまたはアクションをマークします。

public class AuthorisationFilter : IAuthorizationFilter ....
public class Authorization : Attribute ....

kernel.BindFilter<AuthorisationFilter>(FilterScope.Action, 0)
      .WhenActionMethodHas<Authorisation>()
      .WithPropertyValueFromActionAttribute<Authorisation>("Roles", n => n.Roles)
      .WithPropertyValueFromActionAttribute<Authorisation>("Years", n => n.Years);
于 2012-02-02T22:43:44.697 に答える
0

すでに尋ねられた質問と同様の問題がありますが、解決できません。内部でdbコンテキストにアクセスできるカスタム認証フィルターを追加しています。dbcontextは、InRequestScope(Ninject Binding)で使用されるように定義されています。フィルタが実行されているポイントに到達すると、dbcontextがすでに破棄されているというエラーが発生します。

 void IAuthorizationFilter.OnAuthorization(AuthorizationContext filterContext)
{
....
var customerPermissions = _authorizationService.GetCustomersListForPermission(_userProvider.CurrentUser.Username,
                this.PermissionEnums);
..
}

オーロリゼーションサービスは、現在のユーザーのアクセス許可をdbに要求します。これは、Ninjectが新しいdbcontextインスタンスを作成する必要があることを意味しますが、これは発生しません...「MVCフレームワーク自体がフィルターをキャッシュします。」https:// github .com / ninject / Ninject.Web.Mvc / wiki / Filters-and-Scoped

しかし、フィルターバインディングを実装する方法を取得できません。

現在、これらは私が持っているバインディングです:

kernel.Bind<TDBContext>().ToSelf().InRequestScope();
     kernel.Bind<IUnitOfWork>().To<UnitOfWork>();//.InThreadScope();

            kernel.Bind<IUnitOfWorkManager>().To<UnitOfWorkManager>().InRequestScope();

  #region UserAllCSPermissionBasedAuthFilter
            kernel.BindFilter<UserAllCSPermissionBasedAuthFilter>(FilterScope.Action, 0)
              .WhenActionMethodHas<UserAllCSPermissionBasedAuthFilter>()
              .WithConstructorArgumentFromActionAttribute<UserAllCSPermissionBasedAuthFilter>("permissionEnums", att => att.PermissionEnums);

            kernel.BindFilter<UserAllCSPermissionBasedAuthFilter>(FilterScope.Controller, 0)
               .WhenActionMethodHas<UserAllCSPermissionBasedAuthFilter>()
               .WithConstructorArgumentFromControllerAttribute<UserAllCSPermissionBasedAuthFilter>("permissionEnums", att => att.PermissionEnums);
            #endregion




   [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
    public class UserAllCSPermissionBasedAuthFilter : FilterAttribute, IAuthorizationFilter
    {
        #region Private Fields
        private static readonly ObjectCache _permissionCache = MemoryCache.Default;
        private static readonly ILog _log = LogManager.GetLogger(typeof(UserAllCSPermissionBasedAuthFilter));

        [Inject]
        public  IAuthorizationService _authorizationService { get; set; }/// DependencyResolver.Current.GetService<IAuthorizationService>();
于 2015-04-30T14:15:35.900 に答える