为什么在IAuthorizationPolicy.Evaluate()中OperationContext.Current为null但只有前两次?

时间:2011-07-25 08:51:50

标签: c# .net wcf network-programming

我已经使用一些自定义身份验证和授权实现了WCF服务。

实现IAuthorizationPolicy的我的类的Evaluate方法被调用3次。

这是因为在Evaluate方法中,我试图从OperationContext.Current属性访问客户端IP地址,如下所示:

OperationContext context = OperationContext.Current;
MessageProperties prop = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpoint = prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;

IPAddress address = null;
if (endpoint != default(RemoteEndpointMessageProperty))
{
    IPAddress.TryParse(endpoint.Address, out address);
}
return address;

OperationContext.Current属性在方法运行的前两次始终为null,但是第三次​​调用Evaluate方法时,属性已设置。

在什么阶段设置了OperationContext.Current属性?从哪里来?

我能做些什么吗?它没有引起任何大问题 - 授权在第三次通过方法时进行......但是我感觉这对我来说不正确。

如果有人能够填补我做错的事情,或者忽视这样做会很棒。或者,只是解释为什么我看到这种行为也会非常有趣。感谢。

2 个答案:

答案 0 :(得分:0)

你的案子非常有趣,我可能会花一些时间来调查它。

我认为您可以尝试开发自定义ServiceAuthorizationManager,并且在CheckAccessCore方法中,您应始终可以访问OperationContext.Current。

答案 1 :(得分:0)

我的理解是,在完成所有授权之前,WCF甚至不会设置操作上下文。他们首先进行身份验证/授权,然后,只有在成功时,才会通过创建上下文然后调用它来开始调用您的操作。

所以,可悲的是,你刚刚失去位置。

但是,我也有兴趣在此时获取IP。