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