【问题标题】:Calling WCF service hosted in Forms Authentication site from a Windows Service从 Windows 服务调用托管在表单身份验证站点中的 WCF 服务
【发布时间】:2015-04-29 17:33:33
【问题描述】:

我们有一个 Windows 服务进程,它不断地处理来自 微软消息队列。当对这些消息采取行动时,它正在调用 来自 WCF 服务的方法。

WCF 服务托管在一个 ASP.net 网站中,该网站不仅具有 WCF 服务也是一个最终用户的前端。通常,WCF 方法是 修改内存中的数据结构,前端正在读取它们。这 数据不断被修改,需要通知客户变化 立即地。 (我们正在使用 SignalR。)

只要 ASP.net 站点使用 Windows,一切都运行良好 集成身份验证。现在要求前端使用Forms 验证。当然,这破坏了 WCF 绑定。之前的绑定 是:

<basicHttpBinding>
  <binding name="BasicHttpBinding_ISessionWebService">
    <security mode="Transport">
      <transport clientCredentialType="Windows" />
    </security>
  </binding>
</basicHttpBinding>

前端用户不需要能够调用服务。 (事实上​​,他们 应该做不到。)

理想情况下,我希望 WCF 服务继续使用 Windows 身份验证和 站点的其余部分使用表单身份验证,但我认为 IIS 不支持 这。我宁愿不必存储和传递帐户密码 运行 Windows 服务,但如果这是唯一的方法,我可以忍受。一世 在想可能有一些使用客户端证书的绑定,但我 我不确定如何设置。

我怎样才能以安全的方式公开 WCF 端点并且可以 从 Windows 服务调用?

【问题讨论】:

    标签: c# asp.net wcf iis windows-services


    【解决方案1】:

    AFAIK IIS 7 不允许这样做,解决方法似乎比创建两个站点更粗略。

    您可以在服务器上的单独 IIS 站点上分别创建两个服务。数据服务将使用Windows Authentication 并保存数据结构。前端服务将使用Forms Authentication,然后将请求重定向到数据服务。如果您想使用 ApplicationPool 身份排除其他网站,您可以为前端服务的应用程序池使用自定义身份。

    【讨论】:

      【解决方案2】:

      这最终比我想象的要容易。秘方正在改变 安全模式绑定到TransportWithMessageCredential

      来自"Programming WCF Security"

      传输安全性取决于您拥有的绑定机制 选定的用途。例如,如果您使用的是 WSHttpBinding,那么 安全机制是安全套接字层 (SSL)(也是机制 对于 HTTPS 协议)。一般来说,主要优点是 传输安全性在于它提供了良好的吞吐量,无论哪个 您正在使用的交通工具。但是,它确实有两个限制: 首先是传输机制决定了凭证类型 用于对用户进行身份验证....

      TransportWithMessageCredential 中,HTTPS 仍然用于保护 传输消息,但您不必强制使用身份验证 传输机制的方案。所以 IIS 站点仍然可以使用 表单身份验证,但 WCF 消息使用 Windows 进行身份验证。这 绑定如下所示:

      <wsHttpBinding>
        <binding name="WsHttpEndpoint">
          <security mode="TransportWithMessageCredential">
            <transport clientCredentialType="None" />
            <message clientCredentialType="Windows" />
          </security>
        </binding>
      </wsHttpBinding>
      

      从那里,您可以使用以下方法保护 WCF 服务的方法 PrincipalPermissionAttribute,即:

      [PrincipalPermission(SecurityAction.Demand, Role = "DOMAIN\\SomeGroup")]
      public void DoWork()
      {        
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-19
        相关资源
        最近更新 更多