我正在为asp.net mvc 3编写自定义授权过滤器.我需要向用户服务注入类,但我不知道如何做到这一点.
public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
private IUserService userService;
private string[] roles;
public AuthorizeAttribute(params string[] roles)
{
this.roles = roles;
}
public void OnAuthorization(AuthorizationContext filterContext)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用ninject进行依赖注入.我不想使用Factory或服务定位器模式.
我的绑定在global.acsx中看起来像这样:
internal class SiteModule : NinjectModule
{
public override void Load()
{
Bind<IUserService>().To<UserService>();
}
}
Run Code Online (Sandbox Code Playgroud) 我尽可能多地阅读了这些答案,但它们似乎没有达到一个细节.
问题是当动作过滤器(由控制器注入的服务)绑定到相应的属性时,我一直无法弄清楚如何将参数/属性值从属性传递到其绑定过滤器.下面是代码,下面是我想要的假代码:
过滤器和属性
public class AuthorizationFilter : IAuthorizationFilter
{
private readonly IAuthorizationService _authorizationService;
private readonly UserRoles _requiredRoles; // Enum
public AuthorizationFilter(IAuthorizationService authorizationService, UserRoles requiredRoles)
{
_authorizationService = authorizationService;
_requiredRoles = requiredRoles;
}
public void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Session == null)
HandleUnauthorizedRequest(filterContext);
else {
var authorized = _authorizationService.IsUserInRole((UserSessionInfoViewModel) filterContext.HttpContext.Session["user"], _requiredRoles);
if (!authorized)
HandleUnauthorizedRequest(filterContext);
// else TODO: deal with cache...
}
}
}
public class RequireRolesAttribute : FilterAttribute
{
public readonly UserRoles RequiredRoles;
public RequireRolesAttribute(UserRoles requiredRoles)
{
RequiredRoles = requiredRoles;
} …Run Code Online (Sandbox Code Playgroud) attributes dependency-injection ninject filter asp.net-mvc-3
我使用的是asp.net mvc 3,ninject 2.0和ninject mvc 3插件.
我想知道如何将服务层添加到我的过滤器中(在这种情况下是授权过滤器?).
我喜欢做构造函数注入,所以这是可能的还是我必须注入属性?
谢谢
编辑
我有这个属性注入,但我的属性总是为空
[Inject]
public IAccountService AccountServiceHelper { get; set; }
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
// check if context is set
if (httpContext == null)
{
throw new ArgumentNullException("httpContext");
}
// check if user is authenticated
if (httpContext.User.Identity.IsAuthenticated == true)
{
// stuff here
return true;
}
return false;
}
/// <summary>
/// Application_Start
/// </summary>
protected void Application_Start()
{
// Hook our DI stuff when application starts
IKernel kernel …Run Code Online (Sandbox Code Playgroud)