WCF授权策略:冒充问题

时间:2010-11-03 10:04:11

标签: c# .net wcf impersonation

我有以下情况(大纲):

授权Webservice
该服务被调用并验证(通过执行给定的业务逻辑)用户是否有效。

自定义商业Web服务
这是为业务应用程序创建的一些Web服务,内部调用“授权Web服务”以验证调用业务Web服务的帐户。

我通过在“Custom Business Webservice”中使用WCF服务授权来实现这一逻辑。基本上我配置了

<serviceAuthorization principalPermissionMode="Custom">
    <authorizationPolicies>
        <add policyType="MyCompany.Authorization.WCF.AuthorizationPolicy, MyCompany.AuthorizationDll"/>
    </authorizationPolicies>
</serviceAuthorization>

AuthorizationPolicy在内部调用“授权Web服务”。

问题
问题是我需要模仿我的“自定义商业Web服务”的调用者。客户端身份是正确的,但WindowsIdentity是应用程序池用户的身份 请注意,如果我在AuthorizationPolicy的[OperationBehavior(Impersonation = ImpersonationOption.Required)]方法中使用Evaluate(...)它不,则模拟会在服务中运行。

(显然,我使用Windows身份验证凭据使用传输级安全性)

在进入IAuthorizationPolicy.Evaluate(...)方法之前,任何人都有关于如何模仿调用者的提示吗?

1 个答案:

答案 0 :(得分:3)

总是感觉有点奇怪,回答我自己的问题,但为了分享我与其他人的共识,我将在这里发布“解决方案”。

我会尽量做空:

  1. 无法在IAuthorizationPolicy.Evaluate(...)中假冒。 (S4U2Self可以工作,没有测试,因为我没有那个选项)
  2. 正如我已经提到的,通过放置[OperationBehavior(Impersonation = ImpersonationOption.Required)]来模拟webservice操作中的调用者。因此,调用我的自定义Web服务来检索主体作为我的服务操作中的第一个语句将始终有效。然而,我不喜欢这种方法 作为替代方案,我试图找到WCF服务操作的调用链中的最新可能点,其中模拟最终起作用。这是我找到OperationInvoker

    的地方

    下图说明了在呼叫到达实际操作之前完成的调度顺序(取自here):
    alt text

    参数检查为时尚早,模拟尚未奏效,但幸运的是在Operation Invoker中有效。因此,通过编写自定义操作调用程序并将所有内容包装到自定义操作行为属性中,我能够优雅地解决问题。

    有关blog post I wrote的更多信息。