我碰到了一堵墙,希望有人能指出我出错的地方。
我一直在使用Ninject注入自定义ActionFilterAttributes,这很好用:
kernel.BindFilter<CriticalErrorAttribute>(FilterScope.Last, 1);
我现在正在尝试注入自定义的AuthorizeAttribute。我的语法正确,所以我插入了角色和自定义属性:
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中,服务注入正常,但这里不是。
任何帮助将不胜感激
答案 0 :(得分: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);
答案 1 :(得分:0)
我的问题类似于已经问过的问题,但我无法解决。 我正在添加我的自定义授权过滤器,它们可以访问db上下文。 dbcontext定义为使用InRequestScope(Ninject Binding)。当我点击过滤器正在执行的点时,我收到一个错误,即dbcontext已经被处理掉了。
void IAuthorizationFilter.OnAuthorization(AuthorizationContext filterContext)
{
....
var customerPermissions = _authorizationService.GetCustomersListForPermission(_userProvider.CurrentUser.Username,
this.PermissionEnums);
..
}
aurhorization服务要求db获取当前用户的权限 - 这意味着Ninject应该创建一个新的dbcontext实例,但是这个dosn不会发生...... 我读过&#34; MVC框架本身缓存了过滤器。 &#34; 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>();