WCF通过配置进行模拟

时间:2011-07-01 19:49:55

标签: c# wcf windows-authentication impersonation

我有一个使用WSHttpBinding和Windows身份验证的简单WCF服务。我试图强制服务器在每次调用此服务的方法时冒充客户端的身份。

我尝试了WCF Service Impersonation给出的建议,但结果并不完美。当我尝试导航到WCF服务的登录页面时,我看到错误:

  

合约操作'GetAdvice'   需要Windows身份   自动模仿。一个Windows   表示调用者的身份   不是通过约束提供的   ( '的​​WSHttpBinding', 'http://tempuri.org/')   合同   ( 'IMagicEightBallService', 'http://tempuri.org/'。

关于此错误试图告诉我的任何想法?

可以在ftp://petio.org/2011/07/01/MagicEightBall/浏览整个解决方案(或在http://petio.org/2011/07/01/MagicEightBall.zip下载)。我只是将项目发布到本地IIS文件夹并访问http://localhost/MagicEightBall/MagicEightBallService.svc处的服务。

谢谢!

更新:

我的服务的Web.config:

<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>

  <system.serviceModel>

    <services>
      <service name="Petio.MagicEightBall.MagicEightBallService" behaviorConfiguration="MagicEightBallServiceBehavior">

        <endpoint name="WSHttpBinding_WindowsSecurity_IMagicEightBallService"
                  address="http://localhost/MagicEightBall/MagicEightBallService.svc"
                  binding="wsHttpBinding"
                  contract="Petio.MagicEightBall.IMagicEightBallService" />

        <endpoint address="mex"
                  binding="mexHttpsBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior name="MagicEightBallServiceBehavior">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <serviceAuthorization impersonateCallerForAllOperations="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

  </system.serviceModel>
</configuration>

我的服务代码:

public class MagicEightBallService : IMagicEightBallService
{
    [OperationBehavior(Impersonation=ImpersonationOption.Required)]
    public string GetAdvice()
    {
        MagicEightBall ball = new MagicEightBall();
        return ball.GetAdvice();
    }
}

1 个答案:

答案 0 :(得分:4)

如何将整个问题最小化到最简单的可重现代码,您可以在此处显示?没有人有兴趣下载和审查整个项目。此外,为了以后的参考,相关的代码应该仍然在这里。

我检查了您的项目和客户端代码的正确配置,我发现了两个阻塞问题:

  • 如果要从配置强制执行模拟,则必须仅使用带有Windows身份验证的绑定 - 通过HTTPS公开的端点无需身份验证。
  • WCF中的模拟还要求客户端允许服务模拟其身份,因此在服务上设置配置是不够的。

Here你有一些关于假冒和所有必要/可能设置的文章。