代码之家  ›  专栏  ›  技术社区  ›  Daryl

WCF:无法满足安全令牌的请求,因为身份验证失败

  •  3
  • Daryl  · 技术社区  · 16 年前

    我在同一台机器上有两个WCF服务。一个是出版商,一个是听众。

    发布服务器正在基于和端点动态创建代理。我正在这样的代码中配置代理:

                WSHttpBinding binding = new WSHttpBinding(SecurityMode.Message, true);
                binding.Security.Message.NegotiateServiceCredential = true;
                binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
                binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
                binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
                binding.Security.Message.EstablishSecurityContext = true;
                binding.ReliableSession.Enabled = true;
                binding.TransactionFlow = true;
                return binding;
    

    然后。。。

                Binding binding = GetBindingFromAddress(address);
    
                ChannelFactory<T> factory = new ChannelFactory<T>(binding);
                factory.Credentials.UserName.UserName = "an account on the machine";
                factory.Credentials.UserName.Password = "a password for that account";
    
                T proxy = factory.CreateChannel(new EndpointAddress(address));
    

    当我打电话时,我收到上面的错误。这是我的侦听器配置文件:

       <service behaviorConfiguration="MEX Enabled" name="InvoiceSubscriber">
    <endpoint binding="wsHttpBinding"
              bindingConfiguration="ReliableTransactionalHTTP"
              contract="AtlanticBT.SubscriptionService.Contracts.v1.IAtlanticEvents">
     <identity>
      <dns value="localhost" />
     </identity>
    </endpoint>
    

            <bindings>
            <wsHttpBinding>
                <binding name="ReliableTransactionalHTTP" transactionFlow="true">
                    <reliableSession enabled="true"/>
          <security mode="Message">
            <transport clientCredentialType="Windows" proxyCredentialType="None" realm=""/>
            <message clientCredentialType="Windows" negotiateServiceCredential="true" 
                     algorithmSuite="Default" establishSecurityContext="true"/>
          </security>
                </binding>
      </wsHttpBinding>
        </bindings>
    

    我已经检查了托管服务的目录上的所有ACL,它们似乎都是正确的。IIS安全设置为匿名访问和Windows身份验证。

    所以,如果我在代码中显式地设置凭据,为什么我的侦听器不能进行身份验证?

    1 回复  |  直到 16 年前
        1
  •  16
  •   Drew Marsh    16 年前

    首先,此消息通常意味着计算机不在同一个域中,因此无法使用Windows安全进行通信。这两台服务器在同一个域上吗?

    其次,您已经将端点配置为使用Windows安全性。您不仅在消息级别使用Windows安全性,而且在传输级别使用Windows安全性。这两个看起来都太过分了,你可能只是想做运输。

    第三,您配置的所有内容都显示“我要使用Windows身份验证”,但接下来您要设置ClientCredentials的usernameClientCredentials属性。这些属性仅用于用户名令牌安全,而不是Windows。Windows安全性将获取当前线程的标识并将其转发。

    假设您打算使用Windows安全性,那么您要么需要:

    1. 在希望与订阅服务器通信的单个Windows标识下运行发布服务器进程。
    2. 在发布服务器进程中使用模拟来更改每个调用的安全上下文(查找 WindowsIdentity.Impersonate 更多信息)

    现在,即使您认为自己正在通过设置用户名/密码属性(因为这些属性被忽略)来执行1,从技术上讲,您也在执行2。

    最后,下面是一些关于如何为不同类型的Windows身份验证方案设置绑定的好文档:


    除此之外,如果没有你的更多信息,我不确定还能提供什么。如果你修改你的问题来提供更多的信息/回答我的一些问题,我会很乐意修改我的答案,希望能使它更有用。

    推荐文章