基于 URL 验证 WCF 用户

本文关键字:用户 WCF 验证 URL 基于 | 更新日期: 2023-09-27 18:36:38

如果我有一个 wcf 休息服务,例如 http://somedomain.com/service.svc/uniqueid/somemethod/parameter1那么有没有办法全局检查唯一ID是否对到达服务器的每个请求有效。我可以为每个操作合同进行检查,但我正在寻找一种不需要这样做的方法,以便每次访问服务时都会检查唯一 id,如果无效则不会继续。

只是为了进一步了解我想要实现的目标......WCF 服务是一个开放的 API。获取唯一ID也是开放的,不需要任何类型的注册。我想使用 uniqueid,这样如果 API 被滥用,我可以轻松地提取 1 个 ID 的访问权限,而不会影响系统的任何其他用户。

更新:根据迈克的建议,我创建了一个IParameterInspector

[AttributeUsage(AttributeTargets.Class)]
class IDParameterInspector : Attribute, IParameterInspector

并将其附加到我的服务类

[IDParameterInspector]
public class MetaData : IMetaData

我现在遇到的问题是ApplyDispatchBehavior永远不会运行。

public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        foreach (ChannelDispatcher channelDispatcher in serviceHostBase.ChannelDispatchers)
        {
            if (channelDispatcher == null)
            {
                continue;
            }
            foreach (var endPoint in channelDispatcher.Endpoints)
            {
                if (endPoint == null)
                {
                    continue;
                }
                foreach (var operation in endPoint.DispatchRuntime.Operations)
                {
                    operation.ParameterInspectors.Add(this);
                }
            }
        }
    } 

现在有人知道我做错了什么吗?

基于 URL 验证 WCF 用户

这是如何使用参数检查器和通过属性自定义行为的方法。 不幸的是,您需要同时实现两者。

所以从界面中服务方式的装饰开始

[MyFirstCustomBehavior()]
string SayHello(string language);

然后,我们需要定义 MyFirstCustomBehavior 类。

internal sealed class MyFirstCustomBehavior : Attribute, System.ServiceModel.Description.IOperationBehavior
{
    #region IOperationBehavior Members
    public void AddBindingParameters(System.ServiceModel.Description.OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
    {
        //no special behaviour
    }
    public void ApplyClientBehavior(System.ServiceModel.Description.OperationDescription operationDescription, System.ServiceModel.Dispatcher.ClientOperation clientOperation)
    {
        throw new NotImplementedException();
    }
    public void ApplyDispatchBehavior(System.ServiceModel.Description.OperationDescription operationDescription, System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation)
    {
        dispatchOperation.ParameterInspectors.Add(new MyFirstCustomParameterInspector());
    }
    public void Validate(System.ServiceModel.Description.OperationDescription operationDescription)
    {
        //no special behaviour
    }
    #endregion
}

然后,我们需要对检查器进行编码。

internal sealed class MyFirstCustomParameterInspector : System.ServiceModel.Dispatcher.IParameterInspector
{
    #region IParameterInspector Members
    public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
    {
        ////do stuff here
    }
    public object BeforeCall(string operationName, object[] inputs)
    {
        ////or here
        return null;
    }
    #endregion
}

然后你应该很高兴。

您可以尝试创建将影响所有传入请求的自定义服务行为

下面是一个基于 IP 地址筛选请求的示例,您可以将其用作参考。如果我有时间,我会发布一些代码。