我已经使用一些自定义身份验证和授权实现了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属性?从哪里来?
我能做些什么吗?它没有引起任何大问题 - 授权在第三次通过方法时进行......但是我感觉这对我来说不正确。
如果有人能够填补我做错的事情,或者忽视这样做会很棒。或者,只是解释为什么我看到这种行为也会非常有趣。感谢。
答案 0 :(得分:0)
你的案子非常有趣,我可能会花一些时间来调查它。
我认为您可以尝试开发自定义ServiceAuthorizationManager,并且在CheckAccessCore方法中,您应始终可以访问OperationContext.Current。
答案 1 :(得分:0)
我的理解是,在完成所有授权之前,WCF甚至不会设置操作上下文。他们首先进行身份验证/授权,然后,只有在成功时,才会通过创建上下文然后调用它来开始调用您的操作。
所以,可悲的是,你刚刚失去位置。
但是,我也有兴趣在此时获取IP。