使用Ninject MVC实现FluentSecurity 2.0.0

时间:2013-09-12 12:10:21

标签: asp.net-mvc-4 ninject.web.mvc fluent-security

Error activating ISecurityContext using binding from ISecurityContext to SecurityContext.

当我尝试在ASP.NET MVC 4 Web应用程序中使用Ninject.Web.Mvc3配置它时,我收到了FluentSecurity 2.0.0的上述错误。

我认为FluentSecurity和Ninject IoC的内部IoC可能会发生冲突。或者我可能在SecurityConfigurator中错误地设置了DependencyResolver。

我需要使用IoC进行设置,因为我需要通过注入的类来获取UserRoles。

public static class SecurityConfig
{
    public static ISecurityConfiguration Configure()
    {
        SecurityConfigurator.Configure(
            configuration =>
                {
                    configuration.ResolveServicesUsing(
                        DependencyResolver.Current.GetServices, 
                        DependencyResolver.Current.GetService);

                    configuration.DefaultPolicyViolationHandlerIs(() => new DefaultPolicyViolationHandler());

                    configuration.GetAuthenticationStatusFrom(
                        () => HttpContext.Current.User.Identity.IsAuthenticated);

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

                    configuration.ForAllControllers().DenyAnonymousAccess();
                    configuration.For<AdminController>().RequireAnyRole(Role.Administrator);
                });

        return SecurityConfiguration.Current;
    }
}

我哪里错了?还有另一种方法可以达到这个目的吗?

2 个答案:

答案 0 :(得分:2)

我遇到了同样的情况。之所以发生这种情况是因为Ninject在无法解析依赖关系时抛出异常。我解决了它实现我自己的ISecurityServiceLocator

public class FluentSecurityServiceLocator : ISecurityServiceLocator
{
    public static IKernel Kernel { get; set; }

    public object Resolve(Type typeToResolve)
    {
        return Kernel.TryGet(typeToResolve);
    }

    public IEnumerable<object> ResolveAll(Type typeToResolve)
    {
        if (!Kernel.GetBindings(typeToResolve).Any())
        {
            return new List<object>();
        }
        return Kernel.GetAll(typeToResolve);
    }
}

我在ninject配置类

中传递了内核实例
FluentSecurityServiceLocator.Kernel = kernel;

希望这有帮助!

答案 1 :(得分:0)

我对Ninject并不熟悉,但是你肯定当FluentSecurity要求没有在Ninject注册的东西(比如ISecurityContext)时DependencyResolver.Current.GetServicesDependencyResolver.Current.GetService不会抛出异常吗? / p>

在structuremap中有一个名为TryGetInstance的方法,在请求未在容器中注册的内容时不会抛出异常。您可以在此处详细了解FluentSecurity和IoC的工作原理:

https://github.com/kristofferahl/FluentSecurity/wiki/IoC-container-integration