C# WCF-如何检查请求是否来自MetaDataExchange

C# WCF-如何检查请求是否来自MetaDataExchange,c#,wcf,soap,C#,Wcf,Soap,我有一个远程客户端使用的WCF服务。出于安全原因,客户端被设置为发送包含一些用户数据的标头。在服务端,我有一个类实现了IDispatchMessageInspector 在类内部(在AfterReceiveRequest方法中),我检查每个收到的消息,如果用户数据有效-如果无效(或丢失),则引发异常。但是,当客户机尝试引用或更新服务时,也会触发此事件-服务将其视为常规soap消息。由于此消息不包含必要的头,因此失败 为了解决这个问题,我做了以下几点: public object AfterRec

我有一个远程客户端使用的WCF服务。出于安全原因,客户端被设置为发送包含一些用户数据的标头。在服务端,我有一个类实现了IDispatchMessageInspector

在类内部(在AfterReceiveRequest方法中),我检查每个收到的消息,如果用户数据有效-如果无效(或丢失),则引发异常。但是,当客户机尝试引用或更新服务时,也会触发此事件-服务将其视为常规soap消息。由于此消息不包含必要的头,因此失败

为了解决这个问题,我做了以下几点:

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {
        MessageHeaders headers = request.Headers;
        int index = headers.FindHeader(HEADER_NAME, NAMESPACE);
        if (index < 0)
        {
            // skip verification and log-in if the caller is the MetadataExchangeService
            if (headers.To.AbsoluteUri.EndsWith("mex"))
            {
                return null;
            }

            throw new SecurityException(string.Format("WCF message contains no header with name '{0}' and namespace '{1}'.", HEADER_NAME, NAMESPACE));
        }

   // rest of code.....
}
接收方请求后的公共对象(ref消息请求、IClientChannel通道、InstanceContext InstanceContext) { MessageHeaders=request.headers; int index=headers.FindHeader(HEADER\u名称,命名空间); 如果(指数<0) { //如果调用方是MetadataExchangeService,则跳过验证并登录 if(headers.To.AbsoluteUri.EndsWith(“mex”)) { 返回null; } 抛出新的SecurityException(string.Format(“WCF消息不包含名称为“{0}”和命名空间为“{1}.”的头,头名称,命名空间)); } //代码的其余部分。。。。。 }
所以我的问题是-有没有更聪明的方法来检查呼叫是否来自Mex?或者,AfterReceiveRequest不是进行此用户验证的最佳场所?

这是否会在您的服务中引入安全漏洞?这似乎可以避免安全检查,我只需要在通话结束时加上“mex”。是的,这就是为什么我在寻找一种更聪明的方法:)这不会给您的服务带来安全漏洞吗?这似乎可以避免安全检查,我只需要在通话结束时加上“mex”。是的,这就是为什么我在寻找更聪明的方法:)