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