【问题标题】:Trouble using IAuthorizationPolicy with WCF and Castle-Windsor将 IAuthorizationPolicy 与 WCF 和 Castle-Windsor 一起使用时遇到问题
【发布时间】:2009-11-16 21:31:08
【问题描述】:

我目前正在使用带有 WCF 设施的 Castle-Windsor 来注入我所有的 WCF 服务。我刚刚开始使用自定义IAuthorizationPolicy 添加权限要求,这在服务上按方法完成时似乎可以工作,但是当服务类本身被标记为要求时,我会抛出异常。

我已经根据How To – Use Username Authentication with Transport Security in WCF from Windows Forms 的示例进行了设置。我没有设置自定义 HTTP 模块类,因为我使用的是现有的 Membership 实现。我的 IAuthorizationPolicy 实现 (HttpContextPrincipalPolicy) 基本相同。

我的Web.config 的基本部分是:

<serviceBehaviors\>
  <behavior name="MyBehavior">
    <serviceMetadata httpGetEnabled="true" />
    <serviceDebug includeExceptionDetailInFaults="false" />
    <serviceAuthorization principalPermissionMode="UseAspNetRoles"
                          roleProviderName="UserProvider">
      <authorizationPolicies>
        <clear/>
        <add policyType="Website.FormsAuth.HttpContextPrincipalPolicy,Website"/>
      </authorizationPolicies>
    </serviceAuthorization>
  </behavior>
</serviceBehaviors>

当我对方法提出要求时,一切似乎都正常。这样做是这样的:

[PrincipalPermission(SecurityAction.Demand, Role = RoleNames.USER_ADMINISTRATION)]

如果这是在 OperationContract 方法上,事情会按预期工作。但是,如果它被移动到类本身(它实现了ServiceContract),我会得到以下异常(大部分多余的东西都被删掉了):

Castle.MicroKernel.ComponentActivator.ComponentActivatorException {
    Message = "ComponentActivator: could not instantiate Services.UserService"
    InnerException = System.Reflection.TargetInvocationException {
        Message = "Exception has been thrown by the target of an invocation."
        InnerException = System.Security.SecurityException {
            Message = "Request for principal permission failed."
        }
    }
}

我已经调试过,发现HttpContextPrincipalPolicy 上的构造函数正在被调用,但是Evaluate() 不是当需求附加到类时。当它附加到方法Evaluate() is 被调用时。所以在这一点上,我的新手 .NET/WCF/Castle-Windsor 技能将带我到最远的地方。

有没有办法告诉 Castle-Windsor 在尊重 IAuthorizationPolicy 的同时调用服务构造函数?或者告诉 WCF 需要调用 Evaluate() 来创建类?或者是否有其他方法可以围绕 WCF 做同样的事情?我不想用完全相同的属性声明来标记每一个方法。

【问题讨论】:

    标签: wcf castle-windsor wcf-security


    【解决方案1】:

    当你用PrincipalPermissionAttribute 标记类本身时,它实际上是在告诉运行时,在使用类时必须满足权限要求。因此,现在当 Castle-Windsor 尝试实例化该类时,正在提出权限要求,当然它无法满足,因为此时没有正确建立安全上下文。

    AFAIK,PrincipalPermissionAttribute 在 WCF 的类级别上不受支持,因为其运行时的性质即使从纯 .NET 角度来看也是允许的。因此,Castle-Windsor 出于同样的原因无法创建您的服务实例。

    【讨论】:

    • 这似乎与我所看到的相符。不过我想知道,有没有另一种方法可以做类似的事情而不必标记每种方法?
    • 如果您正在编写自己的 IAuthorizationPolicy,您可以做任何您想做的事情。因此,如果您想创建一个在服务级别控制访问的安全模型,您可以检查当前身份的声明以查看是否允许他们访问该服务。唯一的区别是您负责以自己的形式存储访问控制列表数据,而不是使用 PrincipalPermissionAttribute。这可以是您自己编写的自定义属性,也可以将其存储在数据库/配置文件中的静态代码之外。
    猜你喜欢
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 2013-03-20
    • 2021-07-15
    相关资源
    最近更新 更多