在域外访问 SelfHosted WCF 服务

Posted

技术标签:

【中文标题】在域外访问 SelfHosted WCF 服务【英文标题】:Accessing SelfHosted WCF Services outside a domain 【发布时间】:2011-09-13 14:27:20 【问题描述】:

我们的域内的 Windows 服务使用具有以下设置的 NetTCP 自托管 WCF 服务。

// Set Binding Security.
netTcpBinding.Security.Mode = SecurityMode.Transport;
netTcpBinding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
netTcpBinding.Security.Transport.ProtectionLevel = System.Net.Security.ProtectionLevel.EncryptAndSign;

我们现在要求允许域外的人访问这些服务(只要他们能够提供正确的域凭据)。我们的目标不是通过 IIS 托管服务,只是允许外部人员进入我们的服务。在我的测试中,我能够通过在 WCF 调用期间“模拟”客户端代理凭据来从外部连接到服务。

proxy.ClientCredentials.Windows.ClientCredential.Domain = "MyDomainName";
proxy.ClientCredentials.Windows.ClientCredential.UserName = "MyUserName";
proxy.ClientCredentials.Windows.ClientCredential.Password = "MyPassword";

我的问题是:这是正确的方法吗?有没有更好的办法?任何建议将不胜感激。

【问题讨论】:

【参考方案1】:

如果您需要强制(在代码中,例如凭据弹出窗口,或从配置文件中读取)设置凭据,则此路由完全有效。更安全的选择是使用 Windows 凭据缓存。首先,您将其设置为使用缓存:

proxy.ChannelFactory.Credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;

接下来,您将在凭据缓存中设置凭据。在 Windows XP/2003 中,它位于“存储的用户名和密码”下(在控制面板中),在 Vista/7/2008 中,它位于“用户帐户 > 凭据管理器”下(在控制面板中)。

如前所述,您的方式完全有效 - 缓存更安全。

【讨论】:

感谢您验证我在那里所做的事情。我已经按照相同的思路提出了一个新问题,但使用了证书。如果您对此有任何想法,我很想听听您的意见。***.com/questions/7471253/… CredentialCache.DefaultNetworkCredentials 是否会自动向 Windows 凭据管理器查询远程端点的凭据,并在它们丢失时请求/提供存储它们!!? @uosɐſ 以我的经验确实如此,但是在 MSDN 上没有明确说明。 YMMV。如果您想访问该商店,请尝试一下:microsoft.com/indonesia/msdn/credmgmt.aspx

以上是关于在域外访问 SelfHosted WCF 服务的主要内容,如果未能解决你的问题,请参考以下文章

域服务器和域外客户端中的 net.tcp wcf 服务(托管 Windows 服务)

如何设置ad域外电脑禁止访问域内

在域帐户下运行的 WCF 服务

工作组上的 WCF

与 FQDN 一起使用时,WCF TransportCredentialOnly 安全中断

是否可以使用 jQuery 方法 getJSON 跨域将复杂对象传递给 WCF 服务?