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

时间:2015-07-16 10:28:28

标签: c# wcf soap

我有一个远程客户端使用的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.....
}

所以我的问题是 - 是否有更聪明的方法来检查来电是否来自Mex?或者 AfterReceiveRequest 可能不是进行此用户验证的最佳位置?

0 个答案:

没有答案