【问题标题】:FluentSecurity and NinjectFluentSecurity 和 Ninject
【发布时间】:2013-09-13 14:00:41
【问题描述】:
Error activating IntPtr

我正在尝试在 ASP.NET MVC 4 应用程序中使用 Ninject (v.3) 配置 FluentSecurity (v.1.4)。

如果不抛出上述错误,我无法设置ResolveServicesUsing() 配置表达式。

SecurityConfigurator.Configure(
    configuration =>
        {
            configuration.ResolveServicesUsing(
                DependencyResolver.Current.GetServices, 
                DependencyResolver.Current.GetService);
...

我也尝试过为ResolveServicesUsing() 使用另一个重载

configuration.ResolveServicesUsing(
    type => DependencyResolver.Current.GetServices(type));

FluentSecurity 需要配置 Ninject 以注入查找我的用户角色的方法以及 PolicyViolationHandler 实现。

更新

我发现我可以省略那些有问题的行,而我的 GetRolesFrom() 实现仍然被称为 (hurrah):

configuration.GetRolesFrom(
    () =>
    ((IPersonManager)DependencyResolver
    .Current
    .GetService(typeof(IPersonManager)))
    .GetCurrentUserRoles());

但是,我仍然无法让我的 PolicyViolationHandler 工作:

public class RequireRolePolicyViolationHandler : IPolicyViolationHandler
{
    public ActionResult Handle(PolicyViolationException exception)
    {
        return new RedirectToRouteResult(
            new RouteValueDictionary(
                new
                    {
                        action = "AccessDenied", 
                        controller = "Home"
                    }));
    }
}

我正在像这样在 NinjectModule 中进行绑定:

public class SecurityModule : NinjectModule
{
    public override void Load()
    {
        this.Kernel.Bind<IPolicyViolationHandler>()
                   .To<RequireRolePolicyViolationHandler>();
    }
}

【问题讨论】:

  • 你有没有配置 MVC 的 DependencyResolver 指向 Ninject?我对 Ninject 不熟悉,但通常会在应用启动时调用 DependencyResolver.SetResolver(IDependencyResolver),在其中传入一个包含 Ninject 的方法以解析服务/类型注册的实现。
  • 这似乎是因为我可以使用 DependencyResolver 调用另一个方法,但作为检查,我找到了 ninject.web.mvc3 构建的源代码,它看起来就像 System.Web。正在设置 Mvc DependencyResolver:NinjectMvcHttpApplicationPlugin Start() { DependencyResolver.SetResolver(this.CreateDependencyResolver()); }

标签: ninject ninject.web.mvc fluent-security


【解决方案1】:

激活 IntPtr 时出错

很遗憾,您尚未发布完整的 StackTrace。但通常在将Func 注入某个类而没有绑定或使用工厂扩展时,您会遇到此异常。

【讨论】:

    【解决方案2】:

    我使用 Fluent Security 和 Ninject 作为 IOC 容器。

    在您的 Fluent Security 配置中,您需要将服务定位器设置为 NinjectServiceLocator。

        public static void Configure(IKernel kernel)
        {
            var locator = new NinjectServiceLocator(kernel);
            ServiceLocator.SetLocatorProvider(() => locator);
    
            SecurityConfigurator.Configure(
                configuration =>
                {
                    configuration.GetAuthenticationStatusFrom(() => HttpContext.Current.User.Identity.IsAuthenticated);
    
         ....
        }
    

    您可以获取定位器here

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多