我有一个WCF Web服务,它可以通过多个端点调用。我如何动态检测使用哪个端点?WCF检测哪个绑定被调用
例如,我的服务可以通过HTTPS用结合名为“WSHttpBinding_TransportSecurity_IMyService”或通过Windows集成身份验证绑定名为“WSHttpBinding_WindowsSecurity_IMyService”之称。根据哪一个被调用,我需要采取稍微不同的行动来确定客户的身份。
我该如何解决这个问题? (如果需要更多具体细节,我可以提供。)
我有一个WCF Web服务,它可以通过多个端点调用。我如何动态检测使用哪个端点?WCF检测哪个绑定被调用
例如,我的服务可以通过HTTPS用结合名为“WSHttpBinding_TransportSecurity_IMyService”或通过Windows集成身份验证绑定名为“WSHttpBinding_WindowsSecurity_IMyService”之称。根据哪一个被调用,我需要采取稍微不同的行动来确定客户的身份。
我该如何解决这个问题? (如果需要更多具体细节,我可以提供。)
如果您需要知道源绑定来确定呼叫者的身份,那么您做错了什么。你的服务应该是协议不可知的。身份管理可以使用认证策略来完成。
我希望我可以使协议不可知,但我从Java/Axis2调用WCF方法。 Axis2不支持集成Windows身份验证,所以我不能使用Windows安全性,我必须使用传输安全性。我仍然需要模拟主叫用户,所以我必须通过HTTPS隧道传输用户名/密码然后模拟用户来完成此操作。为了做到这一点,我需要读取用户名/密码的服务代码,并明确模拟用户。如果我这样做,它会打破任何指向服务方法的Windows安全绑定。任何替代想法都会很棒。 –
你不能试图获取当前用户的Windows标识
WindowsIdentity callerWindowsIdentity = ServiceSecurityContext.Current.WindowsIdentity;
,如果它是NULL尝试使用用户名/密码的版本?
回答原来的问题:
您可以使用到IncomingMessageHeaders的属性,使您已使用客户端的URI。
OperationContext contect = OperationContext.Current;
MessageHeaders messageHeaders = contect.IncomingMessageHeaders;
Uri To = messageHeaders.To;
是不是WCF绑定的关键点,以便您不必担心某人如何与您取得联系? – n8wrl
我需要使用模拟。通常这是通过 [OperationBehavior(Impersonation = ImpersonationOption.Allowed)]属性完成的。此属性仅在使用Windows安全绑定时才会激活 - 所以此属性意味着我的代码根据使用的绑定而有所不同。如果微软能够做出这样的属性,我不明白为什么如果我这样做是如此糟糕。 –
顺便说一下,客户端不在Windows机器上,所以我别无选择,只能模仿使用用户名和密码。我希望清除为什么我使用HTTPS并将用户名/密码发送到服务以便模拟。 –