使用城堡windsor的流畅的安全自定义政策

时间:2014-10-28 14:11:16

标签: c# castle-windsor fluent-security

我有流畅的安全设置(和工作)来保护我的控制器操作,并使用城堡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的步骤。文档没有显示特定的Castle Windsor示例,但我提出了&#39;: -

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

嗯它没有用,看起来很奇怪SecurityConfigurator需要Castle Windsor容器,当时调用SecurityConfig.RegisterSecurityRules()我已经完成了Castle Windsor。 任何人都可以告诉我在这种情况下我应该如何配置Fluent Security吗?

1 个答案:

答案 0 :(得分:1)

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

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


该接口实现了ISecurityPolicy:

    public interface ITestPolicy : ISecurityPolicy
{
}


接口可以与Castle连接:

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


我认为Fluent Docs的custom policy examples可以说你需要使用一个策略界面,以便CastleWindsor可以解决它...(除非我错误地使用它!)