使用城堡温莎流畅的安全定制政策

本文关键字:安全 城堡 | 更新日期: 2023-09-27 18:28:18

我有Fluent Security设置(并正在工作)来保护我的控制器操作,并使用castle windsor来解决所有问题(几乎如您可以下载的castlewindsor fluentsecurity项目所示)。我现在想做的是创建一个自定义策略,在我们的Active Directory上运行查询。我已经创建了一个实现ISecurityPolicy的测试策略,但它没有默认的构造函数,因为我需要注入接口来访问AD

 public class TestPolicy : ISecurityPolicy
{
    private readonly IQueryHandler<GetUserQuery, User> userQueryHandler;
    public TestPolicy(IQueryHandler<GetUserQuery, User> userQueryHandler)
    {
        this.userQueryHandler = userQueryHandler;
    }
    public PolicyResult Enforce(ISecurityContext context)
    {
        var adUser = userQueryHandler.Handle(new GetUserQuery());
        if (adUser.HasManager())
        {
            return PolicyResult.CreateSuccessResult(this);
        }
        return PolicyResult.CreateFailureResult(this, "Access denied!");
    }
}

IQueryHandler在其他地方使用,并且解析正确。我向控制器添加了策略:-

configuration.For<Areas.People.Controllers.InfoController>().AddPolicy<TestPolicy>();

但当调用时,会失败:-无法加载TestPolicy!请确保该策略有一个空构造函数或已在IoC容器中注册。现在查看文档,我似乎错过了告诉SecurityConfigurator我正在使用IoC的步骤。文件没有显示温莎城堡的具体例子,但我"想出了":-

SecurityConfigurator.Configure(configuration => configuration.ResolveServicesUsing(type => _container.ResolveAll(type).Cast<object>()));

它不起作用,而且当调用SecurityConfig.RegisterSecurityRules()时,SecurityConfigurator需要Castle Windsor容器,这似乎很奇怪。有人能告诉我在这种情况下应该如何配置Fluent Security吗?

使用城堡温莎流畅的安全定制政策

好吧,我终于成功了:
在SecurityConfigurator中,我有
configuration.ResolveServicesUsing( type => container.ResolveAll(type).Cast<object>(), type => container.Kernel.HasComponent(type) ? container.Resolve(type) : null );
我更改了控制器策略以添加接口,而不是实际策略:

configuration.For<Areas.People.Controllers.InfoController>().AddPolicy<ITestPolicy>();


接口实现ISecurityPolicy:

    public interface ITestPolicy : ISecurityPolicy
{
}


然后接口可以与Castle连接:

container.Register(Component.For<ITestPolicy>().ImplementedBy<TestPolicy>());


我认为Fluent Docs的自定义策略示例可以说,你需要使用一个策略接口,以便CastleWindsor解决它。。。(除非我用错了!)