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;
}
}
我哪里错了?还有另一种方法可以达到这个目的吗?
答案 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.GetServices
和DependencyResolver.Current.GetService
不会抛出异常吗? / p>
在structuremap中有一个名为TryGetInstance的方法,在请求未在容器中注册的内容时不会抛出异常。您可以在此处详细了解FluentSecurity和IoC的工作原理:
https://github.com/kristofferahl/FluentSecurity/wiki/IoC-container-integration