2011-07-29 37 views
0

我有一个WCF Web服务,它可以通过多个端点调用。我如何动态检测使用哪个端点?WCF检测哪个绑定被调用

例如,我的服务可以通过HTTPS用结合名为“WSHttpBinding_TransportSecurity_IMyService”或通过Windows集成身份验证绑定名为“WSHttpBinding_WindowsSecurity_IMyService”之称。根据哪一个被调用,我需要采取稍微不同的行动来确定客户的身份。

我该如何解决这个问题? (如果需要更多具体细节,我可以提供。)

+1

是不是WCF绑定的关键点,以便您不必担心某人如何与您取得联系? – n8wrl

+0

我需要使用模拟。通常这是通过 [OperationBehavior(Impersonation = ImpersonationOption.Allowed)]属性完成的。此属性仅在使用Windows安全绑定时才会激活 - 所以此属性意味着我的代码根据使用的绑定而有所不同。如果微软能够做出这样的属性,我不明白为什么如果我这样做是如此糟糕。 –

+0

顺便说一下,客户端不在Windows机器上,所以我别无选择,只能模仿使用用户名和密码。我希望清除为什么我使用HTTPS并将用户名/密码发送到服务以便模拟。 –

回答

2

如果您需要知道源绑定来确定呼叫者的身份,那么您做错了什么。你的服务应该是协议不可知的。身份管理可以使用认证策略来完成。

+0

我希望我可以使协议不可知,但我从Java/Axis2调用WCF方法。 Axis2不支持集成Windows身份验证,所以我不能使用Windows安全性,我必须使用传输安全性。我仍然需要模拟主叫用户,所以我必须通过HTTPS隧道传输用户名/密码然后模拟用户来完成此操作。为了做到这一点,我需要读取用户名/密码的服务代码,并明确模拟用户。如果我这样做,它会打破任何指向服务方法的Windows安全绑定。任何替代想法都会很棒。 –

0

你不能试图获取当前用户的Windows标识

WindowsIdentity callerWindowsIdentity = ServiceSecurityContext.Current.WindowsIdentity; 

,如果它是NULL尝试使用用户名/密码的版本?

0

回答原来的问题:

您可以使用到IncomingMessageHeaders的属性,使您已使用客户端的URI。

OperationContext contect = OperationContext.Current; 
MessageHeaders messageHeaders = contect.IncomingMessageHeaders; 
Uri To = messageHeaders.To;