65.9K
CodeProject 正在变化。 阅读更多。
Home

在 WCF WsHttp 绑定上启用 HTTPS 的七个简单步骤

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.85/5 (31投票s)

2009年5月25日

CPOL

4分钟阅读

viewsIcon

585025

downloadIcon

11221

WCF WsHttp 绑定启用 HTTPS 的七个简单步骤。

目录

引言和目标

当我们谈论 WCF 安全性时,有两种方式:传输层安全和消息层安全。传输层安全性就是协议内置的安全性。在消息层安全性中,我们需要加密数据,换句话说,安全性被注入到数据本身。在本文中,我们将探讨如何使用 WsHttp 绑定实现传输层安全性。对于传输层安全性,我们无需进行额外的开发,因为它更多的是协议固有的安全模型。在本文中,我们将使用 HTTPS 作为传输安全来实现 WsHttp。

步骤 1:使用 WCF 项目创建简单的服务

第一步是创建一个简单的 WCF 项目。因此,单击“新建项目”并选择“WCF 服务项目”。默认情况下,WCF 项目会创建一个默认函数 GetData()。在本示例中,我们将使用相同的函数。

public class Service1 : IService1
{
    public string GetData(int value)
    {
        return string.Format("You entered: {0}", value);
    }
    public CompositeType GetDataUsingDataContract(CompositeType composite)
    {
        if (composite.BoolValue)
        {
            composite.StringValue += "Suffix";
        }
        return composite;
    }
}

步骤 2:在服务的 web.config 文件中启用传输层安全性

下一步是在 WsHttp 绑定中启用传输安全性。这可以通过“Security”XML 标签来完成,如下面的代码片段所示。

<bindings>
<wsHttpBinding>
<binding name="TransportSecurity">
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
</binding>
</wsHttpBinding>
</bindings>

步骤 3:配置绑定并指定 HTTPS 设置

现在我们需要将绑定与终结点关联起来。因此,使用 bindingConfiguration 标签来指定绑定的名称。我们还需要指定托管服务的地址。请注意地址标签中的 HTTS。

将第二个终结点中的 mexHttpBinding 更改为 mexHttpsBinding

<service name="WCFWSHttps.Service1" behaviorConfiguration="WCFWSHttps.Service1Behavior">
<!-- Service Endpoints -->
<endpoint address="https:///WCFWSHttps/Service1.svc" binding="wsHttpBinding" 
   bindingConfiguration="TransportSecurity" contract="WCFWSHttps.IService1"/>
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
</service>

serviceMetadata 中,我们还需要将 httpGetEnabled 更改为 httpsGetEnabled

<serviceBehaviors>
........
.........
<serviceMetadata httpsGetEnabled="true"/>
.........
.........
</serviceBehaviors>

步骤 4:使 Web 应用程序支持 HTTPS

现在我们已经完成了 WCF 服务项目创建和必要的配置更改,是时候编译 WCF 服务项目并将其托管在启用了 HTTPS 的 IIS 应用程序中了。

我们将使用 makecert.exe,这是一个免费的 Microsoft 工具,用于启用 HTTPS 以供测试。MakeCert (Makecert.exe) 是一个命令行工具,它创建一个由系统测试根密钥或另一个指定密钥签名的 X.509 证书。该证书将证书名称绑定到密钥对的公有部分。证书被保存到文件、系统证书存储或两者中。

您可以从 C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\Bin 获取它,或者也可以从 Windows SDK 获取。

您可以在“C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\Bin”下的 DOS 命令提示符中键入以下内容。请注意,“compaq-jzp37md0”是服务器名称,您需要将其替换为您的 PC 名称。

makecert -r -pe -n "CN= compaq-jzp37md0 " -b 01/01/2000 -e 01/01/2050 -eku 1.3.6.1.5.5.7.3.1 
  -ss my -sr localMachine -sky exchange -sp 
  "Microsoft RSA SChannel Cryptographic Provider" -sy 12

如果通过命令提示符运行此命令,您应该会收到如下所示的成功消息。

现在是时候将此证书分配给您的 IIS 网站了。因此,转到 IIS 属性,单击“目录安全性”选项卡,您应该会看到“服务器证书”按钮。

单击“服务器证书”按钮,然后您将进入 IIS 证书向导。在向导中选择“分配现有证书”。

您会看到证书列表。“compaq-jzp37md0”证书就是我们刚刚使用“makecert.exe”创建的证书。

现在尝试不使用“HTTPS”测试站点,您将收到如下错误…这意味着您的证书正在工作。

不要忘记启用 IIS 匿名访问。

步骤 5:在 Web 应用程序中消费该服务

现在是时候在 ASP.NET Web 应用程序中消费服务应用程序了。因此,单击“添加服务引用”并指定您的服务 URL。您会看到一个警告框,如下图所示。当我们使用 makecert.exe 时,我们没有将主机名指定为服务 URL。所以只需忽略它。

步骤 6:忽略 HTTPS 错误

makecert.exe’创建的是测试证书。换句话说,它不是由 CA 签名的。因此,我们需要在我们的 ASP.NET 客户端消费者中忽略这些错误。我们创建了一个名为 IgnoreCertificateErrorHandler 的函数,即使有错误也会返回 true。此函数作为回调函数附加到 ServicePointManager.ServerCertificateValidationCallback

在同一段代码中,您还可以看到消费服务的代码,它调用 GetData 函数。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using WebApplicationConsumer.ServiceReference1;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

namespace WebApplicationConsumer
{
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        ServicePointManager.ServerCertificateValidationCallback = 
          new RemoteCertificateValidationCallback(IgnoreCertificateErrorHandler); 
        Service1Client obj = new Service1Client();
        Response.Write(obj.GetData(12));
    }
    public static bool IgnoreCertificateErrorHandler(object sender, 
      X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        return true;
    }
}
}

步骤 7:享受成功

现在进行最简单的步骤,编译您的 ASP.NET 客户端并享受成功。

源代码

我还附上了包含客户端和服务的源代码

进一步阅读,请观看下面的面试准备视频和分步视频系列。

© . All rights reserved.