使用 SOAP 实现 Web 服务 (WS) 安全性的示例

⚡ 智能摘要

Web 服务 (WS) 安全标准旨在保护 SOAP Web 服务调用期间交换的数据。本资源解释了安全威胁和应对措施、WS 安全标准、如何使用凭证构建安全的 Web 服务以及 Web 服务安全最佳实践。

  • 🔐 核心标准: WS-Security 为 SOAP 添加了一个安全层,定义了凭据和加密密钥如何在 SOAP 标头中传输。
  • 🌐 HTTPS限制: HTTPS/SSL 可以保护点对点流量,但在多服务器流中,只有 WS-Security 可以确保消息端到端受到保护。
  • 🎫 凭证令牌: 凭据通过 UsernameToken(用于用户名和密码)或 BinarySecurityToken(用于 Kerberos 或 X.509 证书)传递。
  • 🛠️ 安全构建示例: .Net ASMX Web 服务添加了 AuthHeader 类,以便 SOAP 标头携带用于身份验证的用户名和密码。
  • 📋 最佳实践: 审计和日志请求, track 业务操作,正确进行身份验证,并且绝不存储或记录敏感凭据。

Web 服务 WS 安全性

什么是 WS Security?

WS Security 是一种标准,用于解决 Web 服务中数据交换的安全性问题。这是 SOAP 的一项关键特性,也是 SOAP 在创建 Web 服务时非常流行的原因之一。

安全性是任何 Web 应用程序的重要特性。由于几乎所有 Web 应用程序都暴露在互联网上,因此始终存在安全威胁的风险。因此,在开发过程中,安全性至关重要。ping 对于基于 Web 的应用程序,始终建议确保应用程序的设计和开发都考虑到了安全性。

安全威胁及对策

为了了解可能对 Web 应用程序构成威胁的安全问题,让我们来看一个简单的 Web 应用程序场景,看看它在安全性方面是如何工作的。

HTTPS协议是HTTP协议的一项安全措施。HTTPS是客户端和服务器之间通过网络进行安全通信的方式。HTTPS使用安全套接字层(SSL)来实现安全通信。客户端和服务器在进行任何通信时,都会持有数字证书来验证自身的真实性。

HTTPS 安全威胁及应对措施

在客户端和服务器之间的标准 HTTPS 通信中,会执行以下步骤:

  1. 客户端通过客户端证书向服务器发送请求。当服务器看到客户端证书时,它会在其缓存系统中做个记录,以便知道响应只能返回给这个客户端。
  2. 然后,服务器通过发送其证书向客户端验证自身身份。这确保客户端正在与正确的服务器进行通信。
  3. 此后客户端与服务器之间的所有通信均经过加密。这确保了即使其他用户试图破解安全机制并获取所需数据,也无法读取这些数据,因为数据已被加密。

但上述安全措施并非在所有情况下都有效。有时客户端可能需要与多个服务器通信。例如,下面的示例展示了客户端同时与数据库和 Web 服务器通信的情况。在这种情况下,并非所有信息都能通过 HTTPS 协议传输。

多服务器安全威胁及应对措施

SOAP 正是通过 WS 安全规范来克服这些障碍。根据该规范,所有安全相关数据都在 SOAP 标头元素中定义。标头元素可以包含以下信息:

  1. 如果 SOAP 主体内的消息已使用任何安全密钥签名,则可以在标头元素中定义该密钥。
  2. 如果 SOAP 正文中的任何元素被加密,则标头将包含必要的加密密钥,以便在消息到达目的地时可以对其进行解密。

在多服务器环境下,上述 SOAP 身份验证技术有助于实现以下目标:

  • 由于 SOAP 主体是加密的,因此只有托管 Web 服务的 Web 服务器才能解密。这是由 SOAP 协议的设计决定的。
  • 假设消息通过 HTTP 请求传递到数据库服务器;由于数据库没有相应的解密机制,因此无法解密该消息。
  • 只有当请求以 SOAP 协议的形式实际到达 Web 服务器时,它才能解密消息并将相应的响应发送回客户端。

我们将在后续主题中看到 WS 安全标准如何用于 SOAP.

Web 服务安全标准

如前文所述,WS-Security 标准的核心在于将安全定义包含在 SOAP 标头中。SOAP 标头中的凭据通过两种方式进行管理。

首先,它定义了一个名为 UsernameToken 的特殊元素。该元素用于将用户名和密码传递给 Web 服务。另一种方法是通过 BinarySecurityToken 使用二进制令牌。这种方法用于使用 Kerberos 或 X.509 等加密技术的情况。

下图展示了 WS Security 中安全模型的工作原理流程。

Web 服务安全标准工作流程

以下是上述工作流程的具体步骤:

  1. Web 服务客户端可以向安全令牌服务发送请求。该服务可以是一个中间 Web 服务,专门用于向实际的 SOAP Web 服务提供用户名/密码或证书。
  2. 然后将安全令牌传递给 Web 服务客户端。
  3. Web 服务客户端随后调用 Web 服务,但这次要确保安全令牌嵌入到 SOAP 消息中。
  4. 然后,Web 服务将理解带有身份验证令牌的 SOAP 消息,然后可以联系安全令牌服务来查看安全令牌是否真实。

以下代码片段展示了 WSDL 文档中身份验证部分的格式。根据以下代码片段,SOAP 消息将包含两个附加元素,一个是用户名,另一个是密码。

<xs:element name="UsernameToken">
   <xs:complexType>
      <xs:sequence>
         <xs:element ref="Username"/>
         <xs:element ref="Password" minOccurs="0"/>
      </xs:sequence>
      <xs:attribute name="Id" type="xs:ID"/>
   </xs:complexType>
</xs:element>

当 SOAP 消息在客户端和服务器之间实际传递时,包含用户凭据的消息部分可能类似于上面所示的内容。wsse 元素名称是为 SOAP 定义的特殊元素名称,表示它包含基于安全性的信息。

如何构建安全的 Web 服务

现在让我们来看一个 SOAP Web 服务安全示例。我们将基于 SOAP 章节前面演示的示例构建 Web 服务安全机制,并为其添加一个安全层。

在我们的示例中,我们将创建一个简单的 Web 服务,该服务将向调用它的应用程序返回一个字符串。但这次,当调用 Web 服务时,需要向调用服务提供凭据。让我们按照以下步骤创建 SOAP Web 服务并为其添加安全定义。

步骤1) 第一步是创建一个空的 网络 Web 应用程序。在 Visual Studio 2013 中,单击菜单选项文件->新建项目。

构建安全 Web 服务新项目

单击“新建项目”选项后,Visual Studio 将为您提供另一个对话框,供您选择项目类型并提供项目的必要详细信息。这将在下一步中解释。

步骤2) 在此步骤中,

  1. 确保您首先选择 C# 这是 ASP.NET Web 应用程序的 Web 模板。要创建 Web 服务项目,项目必须属于此类型。选择此选项后,Visual Studio 将执行必要的步骤,添加任何 Web 应用程序所需的必要文件。
  2. 为您的项目命名,在我们的例子中,该项目的名称为“webservice.asmx然后务必指定项目文件的存储位置。

构建安全 Web 服务项目详情

完成后,您将在 Visual Studio 2013 的解决方案资源管理器中看到创建的项目文件。

构建安全 Web 服务解决方案浏览器

步骤3) 在这一步中,我们将向项目中添加一个 Web 服务文件。

  1. 首先,右键单击项目文件,如下图所示。

构建安全 Web 服务 右键单击​​项目

  1. 右键单击项目文件后,您可以选择“添加->Web 服务 (ASMX)”选项来添加 Web 服务文件。只需将 Web 服务文件命名为“教程服务”即可。

构建安全 Web 服务,添加 Web 服务

上述步骤将弹出一个对话框,您可以在其中输入 Web 服务文件的名称。因此,在下面的对话框中,请输入 TutorialService 作为文件名。

构建安全 Web 服务名称对话框

步骤4) 将以下代码添加到您的教程服务 asmx 文件中。以下代码片段用于添加自定义类,该类将用于在生成 SOAP 消息时更改 SOAP 标头。由于我们现在想要将安全凭据添加到 SOAP 标头,因此此步骤是必需的。

构建安全的 Web 服务 AuthHeader 代码

      return "This is a Guru99 Web Service";
   }

   public class AuthHeader : SoapHeader
   {
      public string UserName;
      public string Password;
   }
}

Code 说明:

  1. 我们现在创建一个单独的类,叫做 授权标头 这是类型 SoapHeader 类每当需要更改 SOAP 标头中传递的内容时,都需要创建一个使用 .NET 内置 SoapHeader 类的类。通过自定义 SOAP 标头,我们现在可以在调用 Web 服务时传递“用户名”和“密码”。
  2. 然后我们定义字符串类型的变量“用户名”和“密码”。它们将用于保存传递给 Web 服务的用户名和密码的值。

步骤5) 接下来,需要将以下代码添加到 TutorialService.asmx 文件这段代码实际上定义了我们 Web 服务的功能。该函数返回一个字符串“这是一个 Guru向客户端提供“99 Web 服务”。但这一次,只有当客户端应用程序将凭据传递给 Web 服务时,才会返回该字符串。

构建安全 Web 服务教程服务代码

public class TutorialService : System.Web.Services.WebService
{
   public AuthHeader Credentials;

   [SoapHeader("Credentials")]

   [WebMethod]
   public string Guru99WebService()
   {

      if (Credentials.UserName.ToLower() != "Guru99" ||
      Credentials.Password.ToLower() != "Guru99Password")
      {
         throw new SoapException("Unauthorized",
         SoapException.ClientFaultCode);
      }
      else
      return "This is a Guru99 Web service";
   }

Code 说明:

  1. 在这里,我们创建了前面步骤中创建的 AuthHeader 类的对象。此对象将传递给我们的 Guru99Web服务 其中可以仔细检查用户名和密码。
  2. 现在使用 [SoapHeader] 属性来指定在调用 Web 服务时需要传递用户名和密码。
  3. 在这段代码中,我们实际上是在检查调用 Web 服务时传递的用户名和密码。如果用户名等于“Guru99”,密码等于“Guru然后是“这是一个”的消息 Guru99 Web 服务”将传递给客户端。否则,如果传递了错误的用户名和密码,则会向客户端发送错误信息。

如果代码成功执行,则在浏览器中运行代码时将显示以下输出。

输出:

构建安全 Web 服务输出

以上输出是在程序运行时显示的,这意味着 Web 服务现在可用。让我们点击该服务。 Descript离子链接。

构建安全 Web 服务服务描述

从服务描述中,您现在可以看到用户名和密码是 wsdl 文件。调用 Web 服务时需要发送这些参数。

Web 服务安全最佳实践

以下是使用 Web 服务时应注意的安全事项:

  1. 审计和日志管理 – 使用应用程序日志记录所有发送到 Web 服务的请求。这可以提供详细的报告,说明哪些用户调用了 Web 服务,并在发生任何安全漏洞时有助于进行影响分析。
  2. 对 Web 服务的调用流程 – 注意 Web 服务之间的调用流程。默认情况下,应用程序可能会调用多个 Web 服务,并在这些 Web 服务之间传递身份验证令牌。所有 Web 服务之间的调用都需要监控和记录。
  3. 敏感的信息 – 请勿在日志条目中包含敏感信息,例如密码、信用卡号或任何其他机密信息。如果某个事件包含此类信息,则必须在记录之前将其删除。
  4. Track 商业 Opera系统蒸发散 – Track 项重要的业务操作。例如,对您的应用程序进行监控,以记录对特别敏感的方法和业务逻辑的访问。以在线商店为例。ping 应用程序。典型的应用程序包含多个步骤,例如选择要购买的商品、将商品添加到购物车,以及最终完成购买。整个业务流程需要…… trac由网络服务提供。
  5. 正确的身份验证 身份验证是一种机制,客户端可以通过一组特定的凭据向 Web 服务证明其身份。用户凭据绝不应被存储。因此,如果使用 WS Security 调用 Web 服务,则必须注意 Web 服务不应存储 SOAP 标头中发送的凭据。这些凭据应被 Web 服务丢弃。

常见问题

人工智能可以实时监控网络服务流量,检测异常请求模式,并标记潜在的攻击,例如注入攻击或令牌滥用。它还可以扫描 WSDL 和 SOAP 配置,查找身份验证薄弱或加密缺失的问题。

是的。基于正常流量训练的机器学习模型可以识别出诸如撞库攻击、格式错误的 SOAP 标头或重放攻击等异常情况。安全团队仍应在阻止请求前审查警报,以避免影响合法客户端。

HTTPS 加密两点之间的连接,因此数据一旦到达中间服务器就会暴露。WS-Security 则保护 SOAP 消息本身,保持其完整性。ping 即使数据经过多个服务器,也能提供端到端保护。

UsernameToken 是 SOAP 请求头中的一个 WS-Security 元素,它包含用户名以及(可选的)密码。它允许 Web 服务在处理请求之前验证调用者的身份。

总结一下这篇文章: