1

我们使用 UsernamePasswordValidator 和证书来保护对 WCF 服务的访问。

但是,我们使用的自定义授权策略是 SERVICE 行为,而不是端点行为,因此它们适用于所有端点,包括 MEX 端点。我们希望能够使用 Visual Studio 获取服务引用,而不必每次都注释掉服务行为,但是由于 mex 和 wshttp 端点都是安全的,所以在执行“添加服务引用”时会出现错误..”

有没有办法解决?

4

2 回答 2

1

您是否在两者上使用相同的绑定?如果是这样,请尝试 2​​ 个单独的绑定 - 一个用于 mex 端点,一个用于 wshttp:

所以对于服务 - 比如:

<wsHttpBinding><binding name="wsHttpBindingMessageUname">
<security mode="Message">
    <message clientCredentialType="UserName" negotiateServiceCredential="true"
      establishSecurityContext="false" />
</security></binding></wsHttpBinding>

对于 mex 端点(无安全性):

<customBinding><binding name="customMex">
<textMessageEncoding>
    <readerQuotas maxDepth="2147483647"
          maxStringContentLength="2147483647"
          maxArrayLength="2147483647"
          maxBytesPerRead="2147483647"
          maxNameTableCharCount="2147483647" />
</textMessageEncoding>
<httpTransport transferMode="Buffered"
               maxReceivedMessageSize="2147483647"
               maxBufferSize="2147483647"/></binding></customBinding>

服务端点将类似于:

<endpoint address="" behaviorConfiguration="Server.Services.DefaultEndpointBehavior"  binding="wsHttpBinding" bindingConfiguration="wsHttpBindingMessageUname" name="DefaultHttp" contract="Server.Services.IMyService" listenUriMode="Explicit" />
<endpoint address="mex" binding="customBinding" contract="IMetadataExchange" name="" bindingConfiguration="customMex" listenUriMode="Explicit" />

使用此设置,它不会为 mex 应用安全性,因此在尝试更新服务参考时不应收到该消息。要么,要么创建另一个使用不同凭据的安全绑定,即您机器上的客户端证书。

以下MSDN帖子有一个示例,可以在此博客上找到有关安全 mex 端点的更多信息。

于 2009-06-25T09:46:52.187 回答
0

我认为从问题中他还注意到他正在使用服务行为,因此绑定配置不会产生影响,因为整个服务都使用 UserNamePassword Validator。

这里想到两件事。

移除显式 mex 绑定并在服务行为下添加

<serviceMetadata httpsGetEnabled="true" />

或保留 mex 绑定,并启用

<serviceMetadata httpGetEnabled="true" />

请求元数据时不会执行 CustomUserNameValidator,因此如果未启用 httpsgetenabled,并且您在 http 上有 mex 绑定,则至少需要 httpGetenabled

于 2009-06-25T10:08:20.833 回答