wcf webservice 和使用 https 的 URL 转发

Posted

技术标签:

【中文标题】wcf webservice 和使用 https 的 URL 转发【英文标题】:wcf webservice and URL forwarding with https 【发布时间】:2015-02-14 06:31:22 【问题描述】:

我这几天一直在研究并尝试解决这个问题,但没有成功。

我在 Windows Server 2012 上的 IIS 8 上部署了 WCF Web 服务。

在开发过程中,我一直在使用服务的完整 url 来进行服务调用。

示例:

http://myserver.com/appservices/service1.svc/getdata 

但现在我需要做以下事情:

    我在 godaddy 上有一个域,比如说 somedomain.com,我想使用一个子域 services.somedomain.com 来代替完整的网址。所以我想要services.somedomain.com/getdata 之类的东西,而不是写上面的完整网址。我无法做到这一点。我尝试在 Godaddy 上为子域 services 设置 URL 转发以转发到 http://myserver.com/appservices/service1.svc,这适用于浏览器,但是在移动应用程序或通过提琴手使用它时,我收到 301 错误。 (我尝试了有和没有掩蔽)。有没有办法做到这一点?

    我需要为此获得 SSL 认证。我的问题是,我应该为哪个域获得它?我是否为 somedomain.com 或子域 services.somedomain.com 或原始域 myserver.com 获取它。我这里有点迷茫,不想买错ssl证书

为了让您大致了解我希望获得的最终结果,我需要具备以下条件:

somedomain.com 指向部署在 iis 上的网站

services.somedomain.com 指向部署在同一 iis 上的 wcf webservice,它将用于将从 android/iphone 调用的服务。 这需要有 SSL 认证

我从 godaddy 购买了 somedomain.com

非常感谢任何提示/帮助我真的很感激

【问题讨论】:

您是否尝试在 IIS 8 上配置 HTTP redirect? 您在哪里托管?自主办?天蓝色? Http 301 不是错误,而是重定向。浏览器自动遵循此重定向,.Net WebClient 也是如此。也许 iPhone/Android 默认情况下不会。它是 REST 服务吗?它必须是 services.somedomain.com/getdata 还是 services.somedomain.com/api/getdata? @Dennis 我有自己的专用服务器,我是管理员。这是一个 Windows Server 2012。 @codeworx 是的,它是一个 REST 服务。我更喜欢它是 services.somedomain.com/getdata,但如果这不可行,那么我可以使用 services.somedomain.com/api/getdata。我对使子域工作并拥有 https 更感兴趣。谢谢 【参考方案1】:

现在我从上面的问题中对情况有了更好的了解。

首先,由于您拥有两个域并且您是 Windows 2012 服务器的管理员,我建议您直接将somedomain.com 添加到您的服务器, 即不要重定向它。这更好,因为您只需要购买您需要的 SSL 证书。如果您使用重定向,则需要两个域的 SSL 证书,否则您的用户会收到安全警告,因为原始请求与证书不匹配。

您还想要的是 Url Rewrite,而不是 Redirect。有什么不同? 重定向是一个客户端请求,让网络浏览器转到另一个网站(使用301 error code)。 rewrite 是在 URL 到达您的服务之前对其进行 服务器端重写

您可以开始使用 Url Rewriting 将以下内容添加到您的 Web.config 文件中:

<system.webServer>
  <rewrite>
    <rules>
      <!-- My rules -->
    </rules>
  </rewrite>
</system.webServer>

我们将添加一些规则(假设您在同一台服务器上有services.somedomain.com)。

    第一条规则,将http://services.somedomain.com/appservices/service1.svc/getdata重写为http://services.somedomain.com/getdata

    <rule name="SubDomainAppService" stopProcessing="true">
        <match url="(.*)" />
        <conditions>
            <add input="HTTP_HOST" pattern="^services\.somedomain\.com$" />
        </conditions>
        <action type="Rewrite" url="HTTPSservices.somedomain.com/appservices/service1.svc/R:1" />
    </rule>  
    

    这将匹配正则表达式模式services.somedomain.com/getdata 的位置,捕获url 的剩余部分并在内部将其重写为services.somedomain.com/appservices/service1.svc/getdata。此规则还强制/重写对HTTPS 的请求。

    要为您的网站强制使用 SSL,您可以通过添加重写规则来执行此操作。这会将HTTP 上的任何传入请求重写为HTTPS

    <rule name="Redirect to HTTPS" stopProcessing="true">
      <match url="(.*)" />
      <conditions>
        <add input="HTTPS" pattern="^OFF$" />
      </conditions>
      <action type="Redirect" url="https://HTTP_HOST/R:1" redirectType="Permanent" />
    </rule>
    

URL 重写是一个复杂的话题,甚至不是我完全理解的话题。我在回答这个问题时阅读的一些资源:

Rewriting the protocol IIS Server Variables URL rewrite and the www subdomain

奖励:

对于您的 DNS、域和 SSL 证书,我建议使用更好的提供商,例如 DNSimple。阅读 Troy Hunt 的* post why he moved。来自 DNSimple 的用于子域和通配符的 SSL 证书是 on their site。

* 如果您不知道 Troy Hunt 是谁,请阅读他关于安全的其余文章。尤其是他关于首先破解你的 API 的帖子。

【讨论】:

使用您提供的信息和一些文件,我能够让它工作。谢谢 这太棒了@Youssef,很高兴我能提供帮助。【参考方案2】:

您需要配置您的服务器,以便它托管两个网站:

    somedomain.com 与绑定: 协议:http,主机名:somedomain.com,端口:80 协议:http,主机名:www.somedomain.com,端口:80 services.somedomain.com 与绑定: 协议:https,主机名:services.somedomain.com,端口:443 协议:http,主机名:services.somedomain.com,端口:80

(最后一个绑定将仅用于将 http 流量重定向到 https)。

SSL:

您必须安装 SSL 证书才能在 IIS 中创建 SSL 绑定。 SSL 证书包含有关为其颁发证书的主机名的信息。颁发给 foo.com 的证书不能用于识别 bar.com。如果您需要保护多个主机名(在这种情况下他们会推荐 UCC 或通配符证书),请务必向证书提供商解释您的需求。

另请注意,IIS7 上的 SSL 主机头配置只能通过 appcmd 命令行完成。

部署:

在不同的目录中设置两个网站(一个包含 www 内容,另一个包含 webservice 文件)。一旦网站和 webservice 文件分开,您可以选择将 webservice 文件放在根目录中。

网址重写:

如果您想从 URL 中删除 service1.svc,您可以使用 URL 重写。它需要安装URL Rewrite module。您可以使用 IIS 管理器 GUI 创建规则。下面是为 services.somedomain.com 生成的 web.config 文件的示例:

<system.webServer>
    <!-- other rules -->
    <rewrite>
        <rules>
            <rule name="http to https" stopProcessing="true">
                <match url="(.*)" />
                <conditions>
                    <add input="HTTPS" pattern="^OFF$" />
                </conditions>
                <action type="Redirect" url="https://HTTP_HOST/R:1" redirectType="Temporary" />
            </rule>
            <rule name="everything to service1.svc">
                <match url="(.*)" />
                <conditions>
                    <add input="REQUEST_FILENAME" matchType="IsFile" negate="true" />
                    <add input="REQUEST_FILENAME" matchType="IsDirectory" negate="true" />
                </conditions>
                <action type="Rewrite" url="/appservices/service1.svc/R:1" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

【讨论】:

【参考方案3】:

既然你问了几个问题,我希望回答其中一些:

    首先检查您的子域 services.domain.com 是否被 godaddy 正确转发。 Ping 到子域以检查它是否命中您自己的服务器。与在 IIS 中相比,您可以使用主机名 services.domain.com 添加 Web 服务。 对于网站,您添加一个单独的网站,其主机名是:domain.com

    SSL 证书有多种选择,但最便宜的一种是为子域获取它:services.domain.com。在 web.config 中,您可以添加如下所示的重定向,以确保服务始终使用 HTTPS 连接。

    <system.webServer>
    <rewrite>
      <rules>
        <rule name="Redirect to HTTPS" stopProcessing="true">
          <match url="(.*)" />
          <conditions>
            <add input="HTTPS" pattern="^OFF$" />
          </conditions>
          <action type="Redirect" url="https://HTTP_HOST/R:1" redirectType="Permanent" />
        </rule>
      </rules>
    </rewrite>
    

    enter code here

【讨论】:

【参考方案4】:

    在 GoDaddy 上将 somedomain.comservices.somedomain.com 定义为 "A" 记录 以及您的服务器的 IP 地址,并将它们配置为您服务器上的两个站点。 不要重定向 - 即使你让它工作了,它也会减慢你的用户并花费你额外的证书。

    您需要两个证书 - 一个用于 somedomain.com,另一个用于 *.somedomain.com注意通配符 - 这将允许您在以后需要其他子域时使用相同的证书。

    我们希望在几个月后看到免费 SSL - 看看 Let's Encrypt,所以最好不要长期提交。

    李>

    假设所有services.somedomain.com 服务都通过此入口点提供,您只需将/appservices/service1.svc 设置为您网站的默认值,即可避免URL 重写。

【讨论】:

以上是关于wcf webservice 和使用 https 的 URL 转发的主要内容,如果未能解决你的问题,请参考以下文章

使用WCF和WEBService出现配置的问题

.NET 的 WCF 和 WebService 有啥区别?

webservice与WCF

Webservice 和 WCF 的区别?

WCF和webservice的区别

webservice服务用 http协议和https协议的区别