带有 SOAP 示例的 Web 服务 (WS) 安全教程

什么是 WS Security?

WS Security 是一种标准,用于解决数据作为 Web 服务的一部分进行交换时的安全性问题。这是 SOAP 中的一项关键特性,使其在创建 Web 服务方面非常受欢迎。

安全性是任何 Web 应用程序的重要功能。由于几乎所有 Web 应用程序都暴露在互联网上,因此 Web 应用程序始终存在安全威胁的可能性。因此,在开发基于 Web 的应用程序时,始终建议确保应用程序的设计和开发都考虑到安全性。

安全威胁及对策

为了了解对 Web 应用程序可能构成的安全威胁,让我们看一下 Web 应用程序的一个简单场景,并了解其在安全方面的工作原理。

HTTP 可用的安全措施之一是 HTTPS 协议。HTTPS 是通过 Web 在客户端和服务器之间进行通信的安全方式。HTTPS 使用安全套接字层或 SSL 进行安全通信。当客户端和服务器之间发生任何通信时,客户端和服务器都将拥有数字证书来表明自己是真实的。

安全威胁及对策

在客户端和服务器之间的标准 HTTPS 通信中,将发生以下步骤

  1. 客户端通过客户端证书向服务器发送请求。当服务器看到客户端证书时,它会在其缓存系统中做个记录,以便知道响应只能返回给这个客户端。
  2. 然后,服务器通过发送其证书向客户端验证自身身份。这确保客户端正在与正确的服务器进行通信。
  3. 此后,客户端和服务器之间的所有通信都将被加密。这样可以确保如果任何其他用户试图破坏安全措施并获取所需数据,他们将无法读取它,因为它已被加密。

但上述类型的安全性并非在所有情况下都有效。有时客户端可以与多个服务器通信。下面给出的示例显示客户端同时与数据库和 Web 服务器通信。在这种情况下,并非所有信息都可以通过 https 协议传递。

安全威胁及对策

这正是 SOAP 发挥作用的地方,它通过制定 WS Security 规范来克服这些障碍。根据此规范,所有与安全相关的数据都在 SOAP 标头元素中定义。

标题元素可以包含以下信息

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

在多服务器环境中,上述 SOAP 身份验证技术可以以以下方式提供帮助。

  • 由于 SOAP 主体是加密的,因此只有托管 Web 服务的 Web 服务器才能解密。这是由 SOAP 协议的设计决定的。
  • 假设如果消息通过 HTTP 请求传递到数据库服务器,则无法解密,因为数据库没有正确的机制来执行此操作。
  • 只有当请求真正以 SOAP 协议到达 Web 服务器时,它才能够解密消息并将适当的响应发送回客户端。

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

Web 服务安全标准

如前面所讨论的,WS-Security 标准主要围绕在 SOAP Header 中包含的安全定义。

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 消息将包含 2 个附加元素,一个是用户名,另一个是密码。

<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 服务的应用程序返回一个字符串。但这一次,当调用 Web 服务时,需要向调用服务提供凭据。让我们按照以下步骤创建我们的 SOAP Web 服务并向其添加安全定义。

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

构建安全的 Web 服务

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

步骤2) 在此步骤中,

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

构建安全的 Web 服务

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

构建安全的 Web 服务

步骤3) 在此步骤中,

我们将向我们的项目添加一个 Web 服务文件

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

构建安全的 Web 服务

  1. 右键单击项目文件后,您可以选择选项“添加->Web 服务 (ASMX)”来添加 Web 服务文件。只需为 Web 服务名称文件提供 Tutorial Service 的名称即可。

    构建安全的 Web 服务

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

构建安全的 Web 服务

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

构建安全的 Web 服务

		return "This is a Guru99 Web Service";
	}
	
	public class AuthHeader : SoapHeader
	{
		public string UserName;
		public string Password;

	}
}

代码说明:-

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

步骤5) 接下来,需要将以下代码添加到 TutorialService.asmx 文件。此代码实际上定义了我们的 Web 服务的功能。此函数向客户端返回一个字符串“This is a Guru99 Web service”。但这次,只有当客户端应用程序将凭据传递给 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);
		}
		eise
		return "This is a Guru99 Web service";
	}

代码说明:-

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

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

输出:

构建安全的 Web 服务

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

构建安全的 Web 服务

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

Web 服务安全最佳实践

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

1. 审计与日志管理 – 使用应用程序日志记录所有对 Web 服务的请求。这将提供有关谁调用了 Web 服务的详细报告,并有助于在发生任何安全漏洞时进行影响分析。

2. Web 服务调用流程 – 尝试记录 Web 服务中的调用流程。默认情况下,应用程序可以使用在这些 Web 服务之间传递的身份验证令牌来调用多个 Web 服务请求。Web 服务之间的所有调用都需要进行监控和记录。

3.敏感信息 – 不要在日志条目中包含敏感信息,例如密码、信用卡号或任何其他机密信息。如果某个事件包含任何此类信息,则需要在记录之前将其丢弃。

4. 追踪业务 Opera系统蒸发散 – 跟踪重要的业务操作。例如,对您的应用程序进行检测以记录对特别敏感的方法和业务逻辑的访问。我们以在线购物应用程序为例。典型的应用程序中有多个步骤,例如选择要购买的商品、将商品装入购物车,然后最终购买。整个业务工作流程都需要由 Web 服务跟踪。

5. 正确的身份验证 – 身份验证是一种机制,通过该机制,客户端可以使用一组可以证明其身份的凭证向 Web 服务确认其身份。永远不应存储用户凭证,因此,如果使用 WS Security 调用 Web 服务,则必须注意,Web 服务不应存储 SOAP 标头中发送的凭证。Web 服务应丢弃这些凭证。

总结

  • SOAP 提供了一个称为 WS Security 的附加层,用于在调用 Web 服务时提供额外的安全性。
  • 可以使用简单的用户名或密码来调用 WS Security,也可以使用二进制证书进行身份验证
  • 我们已经看到 。净 我们可以定制 Web 服务,将用户名和密码作为 SOAP 标头元素的一部分传递。