C# 基于URL验证WCF用户

C# 基于URL验证WCF用户,c#,asp.net,wcf,C#,Asp.net,Wcf,如果我有wcf rest服务,例如 然后,有没有一种方法可以全局检查uniqueid是否对命中服务器的每个请求有效。 我可以检查每个运营合同,但我正在寻找一种不需要检查的方法,以便每次访问服务时都检查uniqueid,如果无效,则不会继续 只是为了进一步了解我想要实现的目标。。。WCF服务是一个开放的API。获得唯一身份证也是开放的,不需要注册。我想使用uniqueid,这样如果API被滥用,我可以轻松地获取1个ID的访问权限,而不会影响系统的任何其他用户 更新:根据Mike的建议,我创建了一个

如果我有wcf rest服务,例如 然后,有没有一种方法可以全局检查uniqueid是否对命中服务器的每个请求有效。 我可以检查每个运营合同,但我正在寻找一种不需要检查的方法,以便每次访问服务时都检查uniqueid,如果无效,则不会继续

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

更新:根据Mike的建议,我创建了一个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);
                }
            }
        }
    } 

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

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


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

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


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

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

因此,从界面中服务方法的装饰开始

[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
}

然后就可以开始了。

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

因此,从界面中服务方法的装饰开始

[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
}

然后您就可以开始了。

指定的唯一id在哪里?它只是传递到URL中的GUID。我在数据库中有一个id列表,为了验证,我只需检查通过URL传递的唯一id是否存在于数据库中。我希望有一种更全球化的方式来实现这一点,而不是在每个运营合同中都进行检查。另外,我知道通过URL传递意味着它不安全,但这并不重要。你看过ParameterInspector吗?这取决于你的实现,但是你可以将ID放在消息头中,然后你可以向你的servicehost添加一个自定义消息检查器,并检查每个传入消息的头。谢谢@MikeMiller-我尝试了一个参数检查器,但认为我做错了什么。你能看看上面更新的代码吗?谢谢这里指定了唯一id?它只是一个传入URL的GUID。我在数据库中有一个id列表,为了验证,我只需检查通过URL传递的唯一id是否存在于数据库中。我希望有一种更全球化的方式来实现这一点,而不是在每个运营合同中都进行检查。另外,我知道通过URL传递意味着它不安全,但这并不重要。你看过ParameterInspector吗?这取决于你的实现,但是你可以将ID放在消息头中,然后你可以向你的servicehost添加一个自定义消息检查器,并检查每个传入消息的头。谢谢@MikeMiller-我尝试了一个参数检查器,但认为我做错了什么。你能看看上面更新的代码吗?谢谢Hank的Mark,这很管用,但我的版本也很管用。我忘了将类IServiceBehavior放在IDParameterInspector:Attribute,IPParameterInspector之后-使用这种方法,您可以将行为和属性组合到一个类中,然后您可以将该类分配给服务,而不是每个服务方法。谢谢,这很有效,但我的版本也可以工作。我忘了将类IServiceBehavior放在IDParameterInspector:Attribute、IPParameterInspector之后-使用这种方法,您可以将行为和属性组合到一个类中,然后可以将该类分配给服务,而不是每个服务方法。