通过 SOAP 的 SQL Server 身份验证

后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。

对于 SQL Server 中的本机 XML Web 服务,可以使用以下两种类型的安全主体之一来管理安全性:

  • Windows 用户或/和组帐户。

  • SQL Server 登录帐户。

Windows 帐户用于 HTTP 端点身份验证时,不需要另外使用 SOAP 身份验证标头。有关 HTTP 端点身份验证的详细信息,请参阅端点身份验证类型GRANT 端点权限 (Transact-SQL)

但是,使用 SQL Server 登录帐户时,客户端应用程序必须另外实现用于 SOAP 身份验证的 Web 服务安全性 (WS-Security) 标头以包含 SQL Server 登录帐户信息并将其提交给服务器。

对于 SQL Server 登录帐户的 SOAP 身份验证,可以使用任何 HTTP 身份验证类型。此外,用于在 HTTP 层进行身份验证的用户帐户仅要求对本地服务器可以进行 Windows 访问,而不要求 SQL Server 登录。

注意注意

对于通过 SOAP 且基于 SQL Server 的身份验证,必须将用于端点的 LOGIN_TYPE 选项配置为混合模式 (LOGIN_TYPE = MIXED)。在混合模式中操作端点还要求对端点进行配置以通过安全套接字层 (SSL) 通道提供服务。有关详细信息,请参阅 CREATE ENDPOINT (Transact-SQL)

使用 WS-Security 标头对 SQL Server 登录帐户进行身份验证(仅限混合模式)

WS-Security 是用于扩展 SOAP 消息结构的建议规范,有助于确保 Web 服务安全。可以根据需要使用 WS-Security 来提供身份验证机制,该机制通过扩展 SOAP 消息结构,在 SOAP 客户端和 SQL Server 实例之间直接通过 SOAP 消息传递凭据和令牌。

如果满足以下条件,就可以使用 WS-Security 标头来提供 SQL Server 用户和密码信息作为 SOAP 客户端应用程序的一部分:

  • 安装的 SQL Server 实例处于混合模式中。这表示同时支持 Windows 登录帐户和 SQL Server 登录帐户。

  • 端点具有以下设置:

    • LOGIN_TYPE = MIXED。

    • PORTS = (SSL),指定了一个 SSL 类型端口。

  • 已为不属于 Windows 登录帐户(例如 SQL Server 登录帐户)的用户授予端点权限。

如果 SOAP 请求中包含 WS-Security 标头,该标头中的凭据将覆盖为端点执行基于 HTTP 的身份验证时使用的所有凭据。

将 WS-Security 标头用于 SQL Server 身份验证

可以将 WS-Security 标头用于发送到 SQL Server 实例的 SOAP 请求中以支持以下操作:

  • 传输 SQL Server 授权(SQL 身份验证)凭据。

  • 处理过期的 SQL Server 密码。

传输 SQL 身份验证凭据

下面的示例说明如何将 WS-Security 标头用于发送到 SQL Server 实例的 SOAP 请求,以传输 SQL Server 授权(SQL 身份验证)凭据。

<SOAP-ENV:Header>
            <wsse:Security  xmlns:wsse=
                        "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
            <wsse:UsernameToken>
                        <wsse:Username>JohnDoe</wsse:Username>
            <wsse:Password Type=
                        "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">pass-word1</wsse:Password>
            </wsse:UsernameToken>
            </wsse:Security>
</SOAP-ENV:Header>

在此示例中,<wsse:UserNameToken> 元素用于包含以下两个子元素:

  • 包含 SQL Server 用户名的 <wsse:Username> 元素。

  • <wsse:Password> 元素,其自身可选的 Type 属性设置为值 "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"。该项用于包含用户的密码文本。

注意注意

SQL Server 和 HTTP SOAP 端点支持使用混合模式时,需要 SSL 端口以至少对用户凭据进行文字加密。

处理过期的 SQL Server 密码

SQL Server 提供了密码过期功能。如果在登录时服务器确定用户密码已过期,则密码功能要求客户端提供用户的旧密码和新密码来成功完成登录过程。

若要更新客户端以支持此功能,您可以使用以下 WS-Security 标头作为模板示例完成此过程。

<SOAP-ENV:Header>
 <wsse:Security  xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
            <wsse:UsernameToken>
                        <wsse:Username>JohnDoe</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">pass-word2</wsse:Password>
            <sql:OldPassword Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText" xmlns:sql="https://schemas.microsoft.com/sqlserver/2004/SOAP">pass-word1</sql:OldPassword>
            </wsse:UsernameToken>
 </wsse:Security>
</SOAP-ENV:Header>

也可以在 SOAP 会话中更改密码。但只允许在启动新会话时请求更改密码。

例如,若要在新的 SOAP 会话中更改密码,请将以下内容添加到 <SOAP-ENV:Header> 部分:

<sqloptions:sqlSession xmlns:sqloptions="https://schemas.microsoft.com/sqlserver/2004/SOAP/Options" initiate="true"/>

有关详细信息,请参阅使用 SOAP 会话

另外,将 <wsse:UserNameToken> 元素稍做修改以包含以下与前面发送用户凭据示例略有差异的三个子元素:

  • 包含 SQL Server 用户名的 <wsse:Username> 元素。

  • <wsse:Password> 元素,其自身可选的 Type 属性设置为值 "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"。该项用于包含用户的新密码文本。

  • <sql:OldPassword> 元素,其自身可选的 Type 属性设置为值 "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"。该项用于包含用户的旧密码文本。

WS-Security 标头的 XML 架构

以下是仅 SQL Server 中实现的 WS-Security 标头的架构片段。

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="https://schemas.microsoft.com/sqlserver/2004/SOAP" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
  <xsd:import namespace="https://schemas.microsoft.com/sqlserver/2004/SOAP" />
  <xsd:annotation>
    <xsd:documentation xml:lang="en">(c) Copyright 2004, Microsoft Corporation The following schema for Microsoft SQL Server is presented in XML format and is for informational purposes only. Microsoft Corporation ("Microsoft") may have trademarks, copyrights, or other intellectual property rights covering subject matter in the schema. Microsoft does not make any representation or warranty regarding the schema or any product or item developed based on the schema. The schema is provided to you on an AS IS basis. Microsoft disclaims all express, implied and statutory warranties, including but not limited to the implied warranties of merchantability, fitness for a particular purpose, and freedom from infringement. Without limiting the generality of the foregoing, Microsoft does not make any warranty of any kind that any item developed based on the schema, or any portion of the schema, will not infringe any copyright, patent, trade secret, or other intellectual property right of any person or entity in any country. It is your responsibility to seek licenses for such intellectual property rights where appropriate. MICROSOFT SHALL NOT BE LIABLE FOR ANY DAMAGES OF ANY KIND ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SCHEMA, INCLUDING WITHOUT LIMITATION, ANY DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL (INCLUDING ANY LOST PROFITS), PUNITIVE OR SPECIAL DAMAGES, WHETHER OR NOT MICROSOFT HAS BEEN ADVISED OF SUCH DAMAGES.</xsd:documentation> 
  </xsd:annotation>
  <xsd:element name="Security">
    <xsd:complexType>
      <xsd:sequence minOccurs="1" maxOccurs="1">
        <xsd:element name="UsernameToken">
          <xsd:complexType>
            <xsd:sequence minOccurs="1" maxOccurs="1">
              <xsd:element name="Username" type="xsd:string" />
              <xsd:element name="Password">
                <xsd:complexType>
                  <xsd:simpleContent>
                    <xsd:extension base="xsd:string">
                      <xsd:attribute name="Type" type="xsd:anyURI" />
                    </xsd:extension>
                  </xsd:simpleContent>
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="OldPassword" type="sql:OldPassword" minOccurs="0" />
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="https://schemas.microsoft.com/sqlserver/2004/SOAP" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="https://schemas.microsoft.com/sqlserver/2004/SOAP">
  <xsd:annotation>
    <xsd:documentation xml:lang="en">(c) Copyright 2004, Microsoft Corporation The following schema for Microsoft SQL Server is presented in XML format and is for informational purposes only. Microsoft Corporation ("Microsoft") may have trademarks, copyrights, or other intellectual property rights covering subject matter in the schema. Microsoft does not make any representation or warranty regarding the schema or any product or item developed based on the schema. The schema is provided to you on an AS IS basis. Microsoft disclaims all express, implied and statutory warranties, including but not limited to the implied warranties of merchantability, fitness for a particular purpose, and freedom from infringement. Without limiting the generality of the foregoing, Microsoft does not make any warranty of any kind that any item developed based on the schema, or any portion of the schema, will not infringe any copyright, patent, trade secret, or other intellectual property right of any person or entity in any country. It is your responsibility to seek licenses for such intellectual property rights where appropriate. MICROSOFT SHALL NOT BE LIABLE FOR ANY DAMAGES OF ANY KIND ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SCHEMA, INCLUDING WITHOUT LIMITATION, ANY DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL (INCLUDING ANY LOST PROFITS), PUNITIVE OR SPECIAL DAMAGES, WHETHER OR NOT MICROSOFT HAS BEEN ADVISED OF SUCH DAMAGES.</xsd:documentation> 
  </xsd:annotation>
  <xsd:complexType name="OldPassword">
    <xsd:simpleContent>
      <xsd:extension base="xsd:string">
        <xsd:attribute name="Type" type="xsd:anyURI" />
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>
</xsd:schema>