基于 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);
}
}
}
}
现在有人知道我做错了什么吗?
这是如何使用参数检查器和通过属性自定义行为的方法。 不幸的是,您需要同时实现两者。
所以从界面中服务方式的装饰开始
[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 地址筛选请求的示例,您可以将其用作参考。如果我有时间,我会发布一些代码。