我已经阅读了许多文章,指出了如何做到这一点,即:
Brad Wilsons excellent tutorial
这些看起来确实不错,但是当我遵循此处的一些准则时>]
Securing your ASP.NET MVC 3 Application
我似乎要来一个庄稼人。对我来说,问题是当我将AuthorizationAttribute添加为GlobalFilter而不是仅装饰控制器/动作时。尽管实际上涉及到我重写了AuthorizeAttribute的OnAuthorization()方法的代码部分时,似乎调用了依赖解析器并设置了我的Public暴露的[Dependency]属性,但我的public [Dependency]属性为null。
当我从全局过滤器中删除它并装饰一个控制器时,它似乎起作用。
如果需要更多信息,我可以发布代码。
编辑:为了进一步扩展,这是我的一些代码:
global.asax.cs
public static void RegisterGlobalFilters(GlobalFilterCollection filters) { // If I have this here the my [Dependency] attribute does not keep it's value // If I remove it and decorate the controller the [Dependency] attribute keeps it value filters.Add(new BasicAuthenticationAttribute()); filters.Add(new HandleErrorAttribute()); } protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); // injection of services and data contexts var container = new UnityContainer(); // injections for services RegisterUnityServices(container); // Filter provides to allow injection into attribute filters RegisterUnityFilters(container); } private void RegisterUnityServices(UnityContainer container) { container.RegisterType<IDataContext, CDAXDataContext>(); container.RegisterType<IUploadService, UploadService>(); container.RegisterType<IAuthenticationService, AuthenticationService>(); // add more services here ... DependencyResolver.SetResolver(new Models.UnityDependencyResolver(container)); } private void RegisterUnityFilters(UnityContainer container) { var oldProvider = FilterProviders.Providers.Single(f => f is FilterAttributeFilterProvider); FilterProviders.Providers.Remove(oldProvider); var provider = new UnityFilterAttributeFilterProvider(container); FilterProviders.Providers.Add(provider); }
我的Brad wilsons示例中的Unity类:
public class UnityDependencyResolver : IDependencyResolver { readonly IUnityContainer _container; public UnityDependencyResolver(IUnityContainer container) { this._container = container; } public object GetService(Type serviceType) { try { return _container.Resolve(serviceType); } catch { return null; } } public IEnumerable<object> GetServices(Type serviceType) { try { return _container.ResolveAll(serviceType); } catch { return new List<object>(); } } }
和
方法时不保留该值。public class UnityFilterAttributeFilterProvider : FilterAttributeFilterProvider { private IUnityContainer _container; public UnityFilterAttributeFilterProvider(IUnityContainer container) { _container = container; } public override IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) { var filters = base.GetFilters(controllerContext, actionDescriptor); foreach (var filter in filters) { _container.BuildUp(filter.Instance); } return filters; } protected override IEnumerable<FilterAttribute> GetControllerAttributes( ControllerContext controllerContext, ActionDescriptor actionDescriptor) { var attributes = base.GetControllerAttributes(controllerContext, actionDescriptor); foreach (var attribute in attributes) { _container.BuildUp(attribute.GetType(), attribute); } return attributes; } protected override IEnumerable<FilterAttribute> GetActionAttributes( ControllerContext controllerContext, ActionDescriptor actionDescriptor) { var attributes = base.GetActionAttributes(controllerContext, actionDescriptor); foreach (var attribute in attributes) { _container.BuildUp(attribute.GetType(), attribute); } return attributes; } }
以及我的BasicAuthenticationAttribute的基础,在该基础上,我设置了[Dependency]属性,但是在激发[[OnAuthorization
public class BasicAuthenticationAttribute : AuthorizeAttribute
{
[Dependency]
public IAuthenticationService Authentication { get; set; }
private void CacheValidateHandler(HttpContext context, object data, ref HttpValidationStatus validationStatus)
{
validationStatus = OnCacheAuthorization(new HttpContextWrapper(context));
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
// code here that uses the Authentication attribute but it's null
}
我已经阅读了许多文章,指出了如何做到这一点,即:堆栈溢出解决方案Brad Wilsons出色的教程这些看起来确实不错,但是当我遵循某些...
[Dependency]
属性是否在这里起作用...因此在OnAuthorization
方法调用IAuthenticationService authentication = DependencyResolver.Current.GetService<IAuthenticationService>();
中>