我正在为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) 嘿那里,我已经成功地在我的FilterAttribute中使用了属性注入,但是我想知道它是否可以将它移动到构造函数中呢?
我目前的代码:
// AuthAttribute.cs
public class AuthAttribute : ActionFilterAttribute
{
public Roles _authRoles { get; private set; }
[Inject]
private readonly IAuthorizationService _service;
public AuthAttribute(Roles roles)
{
_authRoles = roles;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
string redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath;
string redirectUrl = string.Format("?returnUrl={0}", redirectOnSuccess);
string loginUrl = FormsAuthentication.LoginUrl + redirectUrl;
filterContext.HttpContext.Response.Redirect(loginUrl, true);
}
else
{
bool isAuthorized = _service.Authorize(GetUserSession.Id, _authRoles.ToString());
if (!isAuthorized)
{
// TODO: Make custom "Not Authorized" error page.
throw new UnauthorizedAccessException("No access"); …
Run Code Online (Sandbox Code Playgroud) c# asp.net dependency-injection actionfilterattribute asp.net-mvc-3
我有一个自定义授权类,它继承自FilterAttribute并实现IAuthorizationFilter.我正在使用最新版本的Ninject w/asp.net MVC 3支持.
我遇到的问题是我使用构造函数注入来注入存储库.但是在调用OnAuthorization时,存储库为null.这是代码......
public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
private readonly IMyRepo _MyRepo;
public MyAuthorizeAttribute() { }
public MyAuthorizeAttribute(IMyRepo myRepo)
{
_MyRepo= myRepo; //this gets initialized
}
public void OnAuthorization(AuthorizationContext filterContext)
{
_MyRepo.DoStuff(); //<< Null, wtf
}
}
Run Code Online (Sandbox Code Playgroud)
过滤器绑定:
Bind<IMyRepo>().To<MyRepo>().InRequestScope();
this.BindFilter<MyAuthorizeAttribute >(System.Web.Mvc.FilterScope.Controller, null).WhenControllerHas<MyAuthorizeAttribute >();
Run Code Online (Sandbox Code Playgroud)
更新: 我注意到的一件事是这个过滤器处于控制器级别.我在行动范围内有其他过滤器似乎正常工作......这可能是原因吗?
更新2: 我已经确认,如果我将过滤器范围更改为action,则存储库可用OnAuthorization(非null).
这在下面工作,但我需要在控制器范围,而不是行动.
this.BindFilter<MyAuthorizeAttribute >(System.Web.Mvc.FilterScope.Action, null).WhenActionMethodHas<MyAuthorizeAttribute >();
Run Code Online (Sandbox Code Playgroud) 我有这样的事情:
class Root
{
public Root(IDependency dep)
{}
}
class Dependency:IDependency
{
public Dependency(int val)
{}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用ninject获取对Root的引用.所以我这样配置它
var module = new InlineModule(mod => mod.Bind<IDependency>().To<Dependency>());
var kernel = new StandardKernel(module);
Run Code Online (Sandbox Code Playgroud)
我想向Dependency注入一些'val'值,这个值仅在从ninject获取Root引用时才知道.
我想做的是这样的事情:
Kernel.Instance.Get<Root>(With.Parameters.ConstructorArgument("val", 12));
Run Code Online (Sandbox Code Playgroud)
使用ninject 1.0是否可以这样?
我正在关注此页面上的ninject过滤器属性设置.
对他们来说,他们有:
.WithConstructorArgumentFromControllerAttribute<LogAttribute>(
"logLevel", attribute => attribute.LogLevel);
Run Code Online (Sandbox Code Playgroud)
第二个参数是期待a Func<LogAttribute, object> callback
.他们的实际参数列表设置如下:
Log(LogLevel = Level.Debug)
Run Code Online (Sandbox Code Playgroud)
但我的filter属性设置如下:
public class AuthAttribute : FilterAttribute { }
public class AuthFilter : IAuthorizationFilter
{
private readonly IUserService userService;
private string[] roles;
//Stuck on the constructor also. How do I accept params?
public AuthFilter(IUserService userService, params string[] roles)
{
this.userService = userService;
this.roles = roles;
}
public void OnAuthorization(AuthorizationContext filterContext)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
不知怎的,这是错误的.因为我希望我的过滤器看起来像:
[Auth("Admin", "Contrib")]
Run Code Online (Sandbox Code Playgroud)
我的绑定:
kernel.BindFilter<AuthFilter>(FilterScope.Controller, 0)
.WhenControllerHas<AuthAttribute>()
.WithConstructorArgumentFromControllerAttribute<AuthAttribute>("roles", …
Run Code Online (Sandbox Code Playgroud)