摘要: 獲得有關如何設置 sql server 以便在異類環境中進行 Web 服務訪問的詳細討論,並且了解更多有關
SQL Server 中 Web 服務的主要方案的信息。
下載相關的 WebServicePerlScript.exe 代碼示例。
在 SQL Server 中,我們向數據庫引擎中添加了對本機 XML Web 服務的支持。這一功能是圍繞眾所周知的標准
(如 SOAP 1.2、WSDL 1.1 和 HTTP)設計的。將解決方案建立在這些標准之上,可以在大多數企業都擁有的異
類環境中支持互操作性和服務擴張。
添加到 SQL Server 中的新的基礎結構大大有利於直接向服務器外部公開 Web 服務,這是因為將本機 SOAP 堆棧
內置到數據庫引擎中消除了使用中間層進程(如 IIS)達到這一目標的需要。它還使 SQL Server 能夠作為組件
參與面向服務的體系結構,因為服務在這些新的體系結構中提供了黏合劑。本機 XML Web 服務使您既可以將存儲
過程作為 Web 服務公開,而且可以針對數據庫服務器執行特殊的 T-SQL 語句。實際上,我們已經基於 SOAP 創
建了一種新的訪問 SQL Server 的機制;SOAP 提供了與當前的 Tabular Data Stream (TDS) 專用二進制協議幾
乎相同的功能。
我們首先詳細考察如何設置 SQL Server 以便在異類環境中進行 Web 服務訪問。我們將查看如何使用 Perl 腳本
進行數據庫管理,並且簡要考察一下其他可以使用本機 Web 服務的方案。
請考慮這樣一個環境,在這裡,運行在非 Microsoft 操作系統上的應用程序需要連接到 SQL Server。對於此類
應用程序,我們的建議是使用 SQL Server 授權 (SQL-Auth) 連接到 SQL Server Web 服務。讓我們考察一下該
機制是如何工作的。
要公開 Web 服務,用戶需要做的第一件事情是創建一個終結點。請觀察如下所示的用於創建終結點的數據定義
語言 (DDL) 語句。它將一個名為“GetCustomerInfo”的存儲過程公開為 Web 服務。
注 盡管術語 WEBMETHOD 在概念上與 ASP.NET 中的 [WebMethod] 相同,但它在其他方面與 ASP.NET 無關。
CREATE ENDPOINT sql_auth_endpoint
STATE = STARTED AS HTTP( SITE = '*', PATH = '/sql/sql_auth',
AUTHENTICATION = (BASIC), PORTS=(SSL) )
FOR SOAP( WEBMETHOD'GetCustomerInfo'
(
name='AdventureWorks.dbo.GetCustomerInfo',
schema=STANDARD ) ,
LOGIN_TYPE = MIXED,
WSDL = DEFAULT,
DATABASE = 'AdventureWorks',
BATCHES=ENABLED,
NAMESPACE = 'http://Adventure-Works/Customers/' )
為了保持 SQL Server 中的“設計安全”主題,我們在任何情況下都不允許對 SQL Server 進行 ANONYMOUS
訪問。這意味著所有連接都需要使用受支持的身份驗證方案之一在 HTTP 傳輸級別進行身份驗證。BASIC
是最常見和使用最廣泛的身份驗證模型之一,因為它受到大多數客戶端的支持。但是,它也是最不安全的選擇,
因為它要求以明文發送密碼。為了避免該問題,我們要求每當選擇 BASIC 作為身份驗證類型時,都要為 SSL
啟用終結點。要啟用 SSL,必須執行以下命令:
httpcfg set ssl /i IP:Port /h Hash /g Guid
其中,Hash 是證書哈希,Guid 是一個標識注冊該證書的實體的全局唯一標識符 (GUID) 字符串。用戶可以
通過在 Certificate 中查找 Thumbprint 值來獲取證書的哈希值。作為最佳實施策略,請為 SQL Server
的每個實例創建單個 GUID,並且對於該實例執行的所有證書注冊,都使用同一個 GUID。您可以使用任何
工具來發現該 GUID 值。Httpcfg.exe 隨附了 Windows 支持工具。
因此,在該示例中,它將成為:
httpcfg set ssl /i 1.1.1.1:443 /h 4463b7899c499a38812a7bbe7d73f4d31d026b2f /g
"{2bb50d9c-7f6a-4d6f-873d-5aee7fb43290}"
其中,1.1.1.1 會被宿主 SQL Server 的計算機的 IP 地址替換。
那麼,如何在終結點上啟用 SQL-Auth 呢?這是通過在終結點語法的 payload 節中指定“LOGIN_TYPE=MIXED”
完成的。通過指定“MIXED”,您可以使用集成式或 SQL 身份驗證對 SQL Server 實例進行身份驗證。現在,
我們使 SQL 憑據能夠作為有效負載(消息)的一部分流動。在完成該工作時,我們已經小心地確保傳輸憑據的
SOAP 標頭與 WS-Security Username 標記相匹配。遵循 WS-Security 標准自然可以提高互操作性;例如,
只需很少的幾行代碼,就可以使用 Web Services Enhancements 2.0 for Microsoft .NET (WSE) 生成用戶
名標記 SOAP 標頭。
正如您可以在上述討論中看到的那樣,存在兩種級別的身份驗證:
•傳輸級別
•消息級別
現在,讓我們深入探討這兩個級別的身份驗證是如何工作的。
所有請求總是在傳輸級別進行身份驗證。因此,如果用戶提交無效的 BASIC 身份驗證憑據,則連接失敗
,並且發生 HTTP 401 訪問被拒絕錯誤。如果用戶成功地在傳輸級別進行身份驗證,則我們具有兩個選擇。
我們可以使用傳輸憑據或作為 SOAP 消息的一部分到來的憑據登錄 SQL Server。所選的憑據是由 SOAP
消息中是否存在 SQL-Auth 憑據確定的。如果 SOAP 消息中存在憑據,則我們將試圖使用 SQL-Auth
憑據登錄 SQL Server 數據庫。如果該方法失敗,則我們向用戶返回失敗,並且我們不會後退到使用
BASIC 身份驗證憑據。如果 SOAP 消息中不存在憑據,則我們將試圖使用傳輸憑據登錄 SQL Server。
包含 SQL 憑據的 SOAP 消息如下所示:
:
:
:
:
:
user :
:
password :
:
:
:
:
:
xmlns:SOAP- ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sql="http://schemas.microsoft.com/sqlserver/2004/SOAP" xmlns:sqlsoaptypes="http://schemas.microsoft.com/sqlserver/2004/SOAP/types" xmlns:sqlrowcount="http://schemas.microsoft.com/sqlserver/2004/SOAP/types/SqlRowCount" xmlns:sqlmessage="http://schemas.microsoft.com/sqlserver/2004/SOAP/types/SqlMessage" xmlns:sqlresultstream="http://schemas.microsoft.com/sqlserver/2004/SOAP/types/SqlResultStream" xmlns:sqltransaction="http://schemas.microsoft.com/sqlserver/2004/SOAP/types/SqlTransaction" xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes"> :
:
:
SOAP-ENV:Client :
:
There was an error in the incoming SOAPrequest packet: Client, LoginFailure, AccessDenied :
http://schemas.microsoft.com/sqlserver/2004/SOAP :
:
:
SOAP-1_2-ENV:Sender :
:
sqlsoapfaultcode:LoginFailure :
:
sqlsoapfaultcode:AccessDenied :
:
:
:
:
:
There was an error in the incoming SOAPrequest packet: Sender, LoginFailure,
AccessDenied :