0
Error activating ISecurityContext using binding from ISecurityContext to SecurityContext.

ASP.NET MVC 4 Web アプリケーションで Ninject.Web.Mvc3 を使用して構成しようとすると、FluentSecurity 2.0.0 で上記のエラーが発生します。

FluentSecurity の内部 IoC と Ninject IoC が衝突している可能性があると思います。または、SecurityConfigurator で DependencyResolver を誤って設定している可能性があります。

注入されたクラスを介して UserRoles を取得する必要があるため、IoC で設定する必要があります。

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;
    }
}

どこが間違っていますか?これを達成できる別の方法はありますか?

4

2 に答える 2

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;

お役に立てれば!

于 2014-02-12T22:22:55.637 に答える
0

私はNinjectにあまり詳しくありませんが、FluentSecurityがNinjectに登録されていないもの(ISecurityContextなど)を要求したときに例外をスローしないDependencyResolver.Current.GetServicesと確信していますか?DependencyResolver.Current.GetService

structuremap には、コンテナに登録されていないものを要求しても例外をスローしない TryGetInstance というメソッドがあります。FluentSecurity と IC がどのように機能するかについては、こちらをご覧ください。

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

于 2013-10-16T18:05:24.620 に答える