Microsoft Corporation
2004 年 3 月
適用於: Microsoft®SQL Server™2000 Reporting Services
摘要:學習主要著重在 Forms 驗證的 Reporting Services 安全性擴充性能。此外,下載及部署 Reporting Services 的 Forms 驗證擴充功能範例。
(請注意:範例程式碼中的註解均為英文,此文章中所顯示的中文化註解,僅供參考)
(列印共 23 頁)
若要安裝範例程式碼,請下載 Forms 驗證範例安裝程式並在您的電腦上執行。
目錄
簡介 關於本指南 Reporting Services 平台 Forms 驗證範例 結論 其他資源
簡介
部署安全的分散式企業報表解決方案是一項深具挑戰性的過程。從報表存取、到提供重要及機密資料的資料來源,有關在您的報表環境中如何安全地驗證及授權使用者,您必須作出若干決策。而且您報表的安全性僅如在報表連鎖中最脆弱的一個連結。
您需要的安全性類型取決於您的報表環境和已有的安全性系統類型。Microsoft®Windows®驗證是保護 Microsoft®SQL Server™2000 Reporting Services 中報表的主要系統。Windows 驗證提供與其他 Microsoft 伺服器產品緊密的整合;因為 Reporting Services 是在 Windows 驗證上設計和測試的,所以在這個環境中最為安全。
在有些例子中,您可能需要擴充 Reporting Services 安全性系統來適應您企業中的自訂安全性。您可以經由豐富的 Reporting Services API 開發平台來完成這項工作。本指南會呈現在 Reporting Services 中的擴充功能概觀,以及特別是安全性擴充功能。您也可以下載並瀏覽設計來 Reporting Services 並用的 Forms 驗證擴充功能範例。然後,您應該就能夠從 Reporting Services 安全性擴充功能獲益,新增自訂安全性到您的企業報表解決方案。
關於本指南
本指南中的資訊是設計用來:
- 為您介紹 Reporting Services 安全性擴充功能。
- 識別在 Reporting Services 的何處和如何您需要自訂驗證和授權。
- 說明在 Reporting Services 中驗證和授權如何運作。
- 討論 Forms 驗證和如何實作。
- 提供您可以下載和瀏覽的 Forms 驗證範例。
須知事項
本指南並非 ASP.NET 安全性或 Forms 驗證的簡介。它並不會提供您程式設計或應用程式安全性的深入知識。做為一個企圖要實作 Reporting Services 安全性擴充功能的開發人員,您應該已經有下列其中之一或以上的深入經驗:
- Microsoft Reporting Services 功能,特別是驗證、授權和角色架構安全性。
- Microsoft .NET Framework。
- ASP.NET 和 ASP.NET 安全性。
- Forms 驗證。
- 在 .NET 語言的開發經驗。此範例目前只適用於 C#。
如果您要直接探究程式碼的話,可以向前跳到<Forms 驗證範例>一節。不過,您會發現開頭的幾節所介紹的一些您會使用到的技術以及它們如何配合在一起是很有用的。
Reporting Services 平台
Reporting Services 讓報表在整個企業內得以設計、部署和傳遞。從開發人員的觀點而言,Reporting Services 經由 .NET Framework 和 Web service 的主要開發人員平台提供各種不同的程式設計機會。Reporting Services 可以部署在大多數的任何公司來提供完整的報表解決方案。不過,Reporting Services 開放、可擴充的程式設計架構使得它不像是一個現成的產品,而較像是開發人員和一般使用者的報表平台。
擴充 Reporting Services
Reporting Services 設計為可擴充的。Managed 程式碼 API 讓您得以開發、安裝和管理許多 Reporting Services 元件會消耗的擴充功能。您可以使用 .NET Framework 來建立私用或共用的組件,並增加新的 Reporting Services 功能以符合演變中的商務需求。開發人員可以用下列方式擴充 Reporting Services:
- 除了 Microsoft SQL Server、Oracle 和 OLE DB 提供者目前已隨附 Reporting Services 之外,其他的可建立資料處理擴充功能。資料處理擴充功能可以設計由您自己獨特的資料來源讀取資料,並可用於在資料集的建立和過濾上納入額外的商務邏輯。
- 除了 Reporting Services 目前已隨附的電子郵件和檔案共用傳送擴充功能之外,建立其他的傳送擴充功能。傳送擴充功能可用於傳送報表到裝置,包括傳真機、呼叫器、印表機等等。
- 建立 Reporting Services 已經隨附之外的呈現擴充功能。
- 除了目前產品預設安全性機制的 Windows 驗證擴充功能之外,建立其他的安全性擴充功能。
如先前所述,本指南著重在經由 Forms 驗證來擴充 Reporting Services 的安全性系統。
安全性擴充功能
Reporting Services 安全性擴充功能可讓使用者或群組得以驗證和授權;也就是讓不同的使用者登入到報表伺服器,然後根據他們的識別身分,執行不同的工作和操作。在預設狀況下,Reporting Services 使用 Windows 架構的驗證擴充功能,該擴充功能使用 Windows 帳戶通訊協定對宣稱在系統上有帳戶的使用者驗證其識別身分。Reporting Services 使用角色式安全性系統來授權使用者。Reporting Services 角色式安全性模型與其他技術的角色式安全性模型類似。因為安全性擴充功能是以開放、可擴充的 API 為基礎,所以您可以在 Reporting Services 中建立新的驗證和授權擴充功能。以下是使用 Forms 架構驗證和授權的典型安全性擴充功能實作範例:
[圖 1]
如圖所示,驗證和授權進行的過程如下:
- 使用者輸入 URL 嘗試存取「報表管理員」,然後被重新導向到蒐集使用者憑證供用戶端應用程式使用的表單。
- 使用者提交憑證到表單。
- 使用者憑證經由 LogonUser 方法提交給 Reporting Services Web 服務。
- Web 服務呼叫客戶提供的安全性擴充功能並驗證存在於自訂安全性授權的使用者名稱和密碼。
- 在驗證時,Web 服務建立驗證票證 (稱為「Cookie」)、管理票證、並為「報表管理員」的首頁驗證使用者的角色。
- Web 服務傳回 Cookie 給瀏覽器,並在「報表管理員」中顯示適當的使用者介面。
- 一旦完成驗證,瀏覽器在 HTTP 標頭傳輸 Cookie 時會向「報表管理員」提出要求。這些要求是回應「報表管理員」應用程式中使用者的動作。
- 在 HTTP 標頭的 Cookie 以及要求的使用者作業被傳輸到 Web 服務。
- 對 Cookie 進行確認,如果有效的話,報表伺服器從報表伺服器資料庫傳回安全性描述項以及有關要求作業的其他資訊。
- 如果 Cookie 有效,報表伺服器會呼叫安全性擴充功能,檢查使用者是否得到授權執行特定的操作。
- 如果使用者有得到授權,報表伺服器會執行要求的操作並傳回控制給呼叫者。
- 一旦使用者完成驗證,URL 會利用相同的 Cookie 來存取報表伺服器。Cookie 是在 HTTP 標頭中進行傳輸。
- 使用者繼續在報表伺服器上要求作業直到工作階段結束。
何時實作安全性擴充功能
Microsoft 建議您在所有可能的時候使用 Windows 驗證。不過,在下列兩個例子中可能比較適合使用 Reporting Services 的自訂驗證及授權:
- 您有未使用或無法使用 Windows 帳戶的 Internet 或 Extranet 應用程式。
- 您有自訂的使用者和角色並需要在 Reporting Services 中提供相符的授權配置。
安全性擴充功能 API
下表說明可用的安全性擴充功能介面和類別。
介面或類別 |
說明 |
IAuthenticationExtension 介面 |
代表 Reporting Services 中的驗證擴充功能,讓您實作安全性擴充功能類別,以使用自訂驗證配置來驗證使用者。 |
IAuthorizationExtension 介面 |
代表可用於擴充 Reporting Services 中授權功能的擴充功能,讓您實作安全性擴充功能類別,以授權使用者執行作業。 |
IExtension 介面 |
代表 Reporting Services 中的擴充功能。 |
AceCollection 類別 |
代表存取控制項目的集合,用來指定一或多個信任項的存取權限。 |
AceStruct 類別 |
信任項 (使用者、群組或電腦) 的存取控制項目,指定信任項可以在報表伺服器資料庫的項目上執行的作業。 |
CatalogOperationsCollection 類別 |
代表目錄操作的集合。 |
DatasourceOperationsCollection 類別 |
代表資料來源操作的集合。 |
FolderOperationsCollection 類別 |
代表資料夾操作的集合。 |
OperationNames 類別 |
包括使用者可在 Reporting Services 項目上執行的操作之欄位名稱和對應值。 |
ReportOperationsCollection 類別 |
代表報表操作的集合。 |
ResourceOperationsCollection 類別 |
代表資源操作的集合。 |
關於安全性擴充功能 API 各種介面和類別的詳細資訊,請參閱《Reporting Services Books Online》。
Reporting Services 中的驗證
驗證是建立使用者權力到某個識別的過程。有許多技術可供您用來驗證使用者。最常見的方法是使用密碼。例如當您實作 Forms 驗證時,您要實作查詢使用者的憑證 (通常會透過一些要求登入名稱和密碼的介面),然後對照使用者存放區 (例如資料庫資料表或組態檔) 來驗證使用者。如果無法驗證憑證,則驗證程序失敗而使用者會假設為匿名的身分識別。
在 Reporting Services 中,Windows 作業系統透過整合安全性或明確接收來處理使用者的驗證,以及使用者憑證的驗證。Reporting Services 中的自訂驗證可以被開發來支援額外的驗證架構。這有賴於安全性擴充功能介面 IAuthenticationExtension。所有的擴充功能都是繼承自 IExtension,它是報表伺服器使用和部署任何擴充功能的基底介面。IExtension 和 IAuthenticationExtension 都是 Microsoft.ReportingServices.Interfaces 命名空間的成員。
在 Reporting Services 中所有驗證的核心是 LogonUser 方法。Reporting Services Web 服務的這個成員可傳遞使用者憑證給報表伺服器作為驗證之用。您的基本安全性擴充功能會實作 IAuthenticationExtension.LogonUser, 它包含您的自訂驗證程式碼。在本指南稍後討論的 Forms 驗證範例中,LogonUser 會將所提供的憑證對照資料庫中的自訂使用者存放區來執行驗證檢查。Forms 驗證範例如下所示:
在 AuthenticationExtension.cs 中 (Forms 驗證範例)
public bool LogonUser(string userName, string password, string authority)
{
return AuthenticationUtilities.VerifyPassword(userName, password);
}
在 AuthenticationUtilities.cs 中 (Forms 驗證範例)
internal static bool VerifyPassword(string suppliedUserName,
string suppliedPassword)
{
bool passwordMatch = false;
// Get the salt and pwd from the database based on the user name.
// See "How To: Use DPAPI (Machine Store) from ASP.NET," "How To:
// Use DPAPI (User Store) from Enterprise Services," and "How To:
// Create a DPAPI Library" for more information about how to use
// DPAPI to securely store connection strings.
SqlConnection conn = new SqlConnection(
"Server=localhost;" +
"Integrated Security=SSPI;" +
"database=UserAccounts");
SqlCommand cmd = new SqlCommand("LookupUser", conn);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter sqlParam = cmd.Parameters.Add("@userName",
SqlDbType.VarChar,
255);
sqlParam.Value = suppliedUserName;
try
{
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
reader.Read(); // Advance to the one and only row
// Return output parameters from returned data stream
string dbPasswordHash = reader.GetString(0);
string salt = reader.GetString(1);
reader.Close();
// Now take the salt and the password entered by the user
// and concatenate them together.
string passwordAndSalt = String.Concat(suppliedPassword, salt);
// Now hash them
string hashedPasswordAndSalt =
FormsAuthentication.HashPasswordForStoringInConfigFile(
passwordAndSalt,
"SHA1");
// Now verify them. Returns true if they are equal
passwordMatch = hashedPasswordAndSalt.Equals(dbPasswordHash);
}
catch (Exception ex)
{
throw new Exception("Exception verifying password. " +
ex.Message);
}
finally
{
conn.Close();
}
return passwordMatch;
}
驗證流程
Reporting Services Web 服務提供自訂驗證以透過「報表管理員」和報表伺服器來啟用 Forms 驗證。
Reporting Services Web 的 LogonUser 方法是用來提交憑證給報表伺服器作為驗證之用。Web 服務使用 HTTP 標頭由伺服器傳遞驗證票證 (稱為「Cookie」) 到用戶端以驗證登入要求。
下圖描述當您的應用程式部署了設定使用自訂驗證擴充功能的報表伺服器時,Web 服務驗證使用者的方法。
[圖 2]
如 [圖 2] 所示,驗證過程如下:
- 用戶端應用程式呼叫 Web 服務方法 LogonUser 來驗證使用者。
- Web 服務呼叫安全性擴充功能的 LogonUser 方法,特別是實作 IAuthenticationExtension 的類別。
- 您的 LogonUser 實作在使用者存放區或安全性授權中驗證使用者名稱和密碼。
- 在成功的驗證上,Web 服務會為工作階段建立 Cookie 並加以管理。
- Web 服務在 HTTP 標頭中傳回驗證票證給呼叫的應用程式。
當 Web 服務經由安全性擴充功能成功地驗證使用者,它會產生供後續要求使用的 Cookie。Cookie 可能不是保存在自訂安全性授權中,因為報表伺服器並未擁有安全性授權。從 LogonUser Web 服務方法傳回 Cookie,並供後續的 Web 服務方法呼叫和 URL 存取使用。
安全性 為了避免在傳輸期間洩露了 Cookie,從 LogonUser 傳回的驗證 Cookie 應該使用 Secure Sockets Layer (SSL) 加密來進行安全的傳輸。
當有安裝自訂安全性擴充功能時,如果您經由 URL 存取報表伺服器,Internet Information Services (IIS) 和 ASP.NET 會自動管理驗證票證的傳輸。如果您是經由 SOAP API 來存取報表伺服器,您的 Proxy 類別實作必須包括管理驗證票證的額外支援。關於使用 SOAP API 和管理驗證票證的詳細資訊,請參閱本指南稍後的<使用有自訂安全性的 Web 服務>。
Reporting Services 中的授權
授權是決定識別身分是否應該對報表伺服器資料庫中的指定資源授予要求的存取權類型之過程。Reporting Services 使用角色架構的授權架構,根據應用程式中使用者的角色授予使用者對特定資源的存取權。Reporting Services 的安全性擴充功能包括授權元件的實作,用來一旦使用者在報表伺服器上完成驗證之後對使用者授予存取權。當使用者經由 SOAP API 和 URL 存取嘗試在系統或報表伺服器項目上執行操作時就會叫用授權。這有賴於安全性擴充功能介面 IAuthorizationExtension。如先前所述,所有的擴充功能都是繼承自 IExtension,它是您所部署任何擴充功能的基底介面。IExtension 和 IAuthorizationExtension 都是 Microsoft.ReportingServices.Interfaces 命名空間的成員。
在授權中,所有自訂安全性實作的關鍵是存取檢查,它是發生在 CheckAccess 方法中。每一次使用者嘗試在報表伺服器上執行操作時就會呼叫 CheckAccess。CheckAccess 方法對每一種操作類型都會超載。對於資料夾操作,存取檢查的範例看起來如下所示:
// Overload for Folder operations
public bool CheckAccess(
string userName,
IntPtr userToken,
byte[] secDesc,
FolderOperation requiredOperation)
{
// If the user is the administrator, allow unrestricted access.
if (userName == m_adminUserName)
return true;
AceCollection acl = DeserializeAcl(secDesc);
foreach(AceStruct ace in acl)
{
if (userName == ace.PrincipalName)
{
foreach(FolderOperation aclOperation in
ace.FolderOperations)
{
if (aclOperation == requiredOperation)
return true;
}
}
}
return false;
}
報表伺服器經由傳入登入使用者的名稱、使用者權杖、項目的安全性描述項和要求的操作來呼叫 CheckAccess 方法。在此您應該在安全性描述項檢查使用者名稱和適當的權限以完成要求,然後傳回 true 表示授予存取或傳回 false 表示拒絕存取。
安全性描述項
當在報表伺服器資料庫中的項目上設定授權原則時,用戶端應用程式 (例如「報表管理員」) 會將使用者資訊結合項目的安全性原則提交給安全性擴充功能。這個安全性原則和使用者資訊的結合就稱為安全性描述項。對於報表伺服器資料庫中的項目,安全性描述項包括下列資訊:
- 在此項目上有一些類型的權限可執行操作的群組或使用者。
- 此項目的類型。
- 控制存取到此項目的任意存取控制清單。
安全性描述項是使用 Web 服務方法 SetPolicies 和 SetSystemPolicies 建立的。關於這些方法和 Web 服務的詳細資訊,請參閱《Reporting Services Books Online》。
授權流程
Reporting Services 授權是由目前設定在伺服器上執行的安全性擴充功能所控制的。授權是角色架構且受限於 Reporting Services 安全性架構所支援的權限和操作。下圖描述授權使用者操作報表伺服器資料庫中的項目:
[圖 3]
如 [圖 3] 所示,授權遵循下列次序:
- 一旦完成驗證,用戶端應用程式經由 Reporting Services Web 服務方法向報表伺服器提出要求。在每一個 Web 要求中,驗證票證會以 HTTP 標頭中 Cookie 的形式傳遞給報表伺服器。
- 在任何存取檢查之前會先對 Cookie 加以驗證。
- 一旦 Cookie 完成驗證,報表伺服器呼叫 GetUserInfo 且使用者會給予一個識別。
- 使用者經由 Reporting Services Web 服務嘗試進行操作。
- 報表伺服器呼叫 CheckAccess 方法。
- 擷取安全性描述項並傳遞到 CheckAccess 的自訂安全性擴充功能實作。此時,使用者、群組或電腦和被存取項目的安全性描述項比較,並獲授權執行所要求的操作。
- 如果使用者有得到授權,Web 服務會執行操作並將回應傳回給呼叫的應用程式。
Forms 驗證範例
如果您尚未如此做,請下載 Forms 驗證範例安裝程式並在您的電腦上執行以安裝範例程式碼。
關於範例
Forms 驗證範例安全性擴充功能,可下載做為本指南的一部分,使用 Forms 驗證結合 SQL Server 以提供與 Reporting Services 搭配使用的自訂安全性模型。此範例僅作為教育之用。它並不打算被用於實際執行環境,且並未在實際執行環境中進行過測試。Microsoft 並不提供此範例的技術支援。在本範例中的某些案例示範了最佳的實例 (例如建立單向雜湊、Salt 處理過的密碼)。在其他的案例中,最佳實例都已經趨向簡化了。特別要注意,範例安全性擴充功能的許多設定和管理需要系統管理員在報表伺服器電腦上進行。無論如何,不建議在連線環境的實際執行伺服器上使用此範例。
關於 Reporting Services 安全性擴充功能,如果您有任何問題或意見,請連絡 Microsoft Consulting Services (MCS)、Premier Support Services (PSS) 或其他的 Microsoft 支援服務人員。
必備工具
使用此範例您必須有下列工具:
- 安裝有 Microsoft SQL Server 2000 Reporting Services 的報表伺服器。
- Microsoft Internet Explorer 6.0 或更高版本以存取「報表管理員」。
- 安裝有 Microsoft®Visual Studio®.NET 2003 的開發電腦。
注意事項
當實作自訂安全性擴充功能或使用此範例時,請考慮下列事項:
- 不可能在混合模式的安全性系統下 (例如,同時採用 Windows 和 Forms 驗證) 執行報表伺服器。對任何的 ASP.NET 應用程式這個狀況都成立。
- 請記住對於設定此範例而變更的所有組態檔,請儲存備份複本。
- 雖然仍有可能,但在部署此範例之後要還原回 Windows 驗證是有困難的。詳細資訊請參閱本指南稍後的<移除範例擴充功能>。
- 覆寫 Windows 驗證是很冒險的。報表伺服器設計為可擴充安全性,但僅完全測試和支援使用 Windows 驗證而已。
- 務必使用 Secure Sockets Layer (SSL) 和 Forms 驗證。
- 在此範例中,用於驗證的使用者輸入是以 Transact-SQL 命令來傳遞。在您自己使用 Forms 驗證和 SQL Server 的自訂安全性功能中,您應該要非常小心的驗證使用者輸入,並且確認產生的命令沒有語法上的錯誤。您要確定有驗證全部的使用者輸入,以讓有惡意的使用者無法導致您的應用程式執行任意 SQL 命令 (也稱為「SQL 插入攻擊」)。在登入過程期間驗證所提供的使用者名稱是特別重要的,因為您的報表伺服器自訂安全性模型完全取決於是否能夠正確地識別、驗證和授權使用者。
- 在您的自訂使用者存放區,避免讓使用者輸入的名稱中包括下列字元:: ? ; @ & = + $ , \ * > < | . " /. 使用者名稱中有這些字元會使「My Reports」功能發生問題,因為在伺服器中是以使用者名稱來建立資料夾,而這些字元會使資料夾名稱和資料夾路徑產生問題。此範例程式碼使用規則運算式來測試有效的使用者名稱並且確保路徑名稱沒有超過最大容許路徑長度。在您的自訂驗證程式碼中應該執行類似的驗證。
Forms 驗證
Forms 驗證是 ASP.NET 驗證的一種類型,它會將未驗證的使用者導向 HTML 表單。一旦使用者提供憑證,系統就會發出包含驗證票證的 Cookie。在稍後的要求中,系統會先檢查 Cookie 看使用者是否已經由報表伺服器驗證過。
Reporting Services 並不是天生就支援使用 Forms 驗證。不過,Reporting Services 可經由 Reporting Services API 使用安全性擴充功能介面來擴充為支援 Forms 驗證。如果您擴充 Reporting Services 為使用 Forms,對於和報表伺服器的所有通訊請使用 Secure Sockets Layer (SSL),以避免有惡意的使用者取得到其他使用者 Cookie 的存取權。SSL 讓用戶端和報表伺服器彼此驗證對方,並確保沒有其他電腦可以讀取兩部電腦之間通訊的內容。所有從用戶端經由 SSL 連線傳送的資料都經過加密,所以有惡意的使用者無法攔截送到報表伺服器的密碼或資料。
Forms 驗證通常是實作來支援非 Windows 帳戶和驗證。要求存取到報表伺服器的使用者面前會出現圖形介面,然後提供的憑證會提交到安全性授權以進行驗證。
當互動式使用者輸入憑證時,Forms 驗證架構開始運作。不過,對於直接和 Reporting Services Web 服務通訊的自動應用程式,Forms 驗證必須結合自訂驗證架構。
在下列狀況中,Forms 驗證適合 Reporting Services:
- 您需要儲存和驗證的使用者並沒有 Microsoft Windows 帳戶,而且
- 在網站不同的頁面之間,您需要提供自己的使用者介面表單作為登入頁面。
當撰寫支援 Forms 驗證的自訂安全性擴充功能時,請考慮下列事項:
- 如果您使用 Forms 驗證,在 Internet Information Services (IIS) 中的報表伺服器虛擬目錄必須啟用匿名存取。
- ASP.NET 驗證必須設定為 Forms。在 Web.config 檔中為報表伺服器設定 ASP.NET 驗證。
- Reporting Services 可以使用 Windows 驗證或自訂驗證來驗證和授權使用者。Reporting Services 並不支援同時使用多個安全性擴充功能。
部署範例
在您執行和檢查 Forms 驗證範例的程式碼之前,先要採取幾個步驟。在您遵循步驟完成安裝和組態之後,您可以在報表伺服器上使用範例或對其偵錯,或者您可以單純地在 Visual Studio .NET 中檢視範例程式碼。
編譯和安裝擴充功能組件
您必須遵循這些步驟來編譯和安裝擴充功能。這些步驟假設您已將 Reporting Services 安裝在預設位置:C:\Program Files\Microsoft SQL Server\MSSQL\Reporting Services。本指南的其餘內容中會將這個位置參照為 <install>。
若要使用 Visual Studio .NET 來編譯範例
- 在 Microsoft Visual Studio .NET 2003 中開啟 CustomSecurity.sln。如果您下載原始程式碼並安裝範例到預設位置,則您可以在 C:\Program Files\Microsoft SQL Server\MSSQL\Reporting Services\Samples\Extensions 存取它。
- 在 [方案總管] 中選取 [CustomSecurity] 專案。
- 在 [專案] 功能表上按一下 [加入參考]。
- [加入參考] 對話方塊就會開啟。
- 按一下 [.NET] 索引標籤。
- 按一下 [瀏覽],並在您的本機磁碟上瀏覽以尋找 Microsoft.ReportingServices.Interfaces。在預設狀況下,該組件位於 <install>\ReportServer\bin 目錄。按一下 [確定]。
所選取的參照新增到您的專案中。
- 在 [Build (建置)] 功能表上按一下 [Build Solution (建置方案)]。
- 複製 Microsoft.Samples.ReportingServices.CustomSecurity.dll 和 Microsoft.Samples.ReportingServices.CustomSecurity.pdb 到 <install>\ReportServer\bin 目錄。
- 複製 Microsoft.Samples.ReportingServices.CustomSecurity.dll 和 Microsoft.Samples.ReportingServices.CustomSecurity.pdb 到 <install>\ReportManager\bin 目錄。
- 複製 Logon.aspx 頁面到 <install>\ReportServer 目錄以及複製 UILogon.aspx 頁面到 <install>\ReportManager\Pages 目錄。
新增擴充功能到組態檔
在組件和登入頁面複製到伺服器之後,您需要修改「報表伺服器」和「報表管理員」的組態檔。
重要事項 在做任何變更之前請複製所有組態檔的複本。
若要修改 RSReportServer.config 檔
- 使用 Visual Studio .NET 或記事本之類的簡單文字編輯器來開啟 RSReportServer.config 檔。RSReportServer.config 位於 <install>\ReportServer 目錄。
- 找出 <Security> 和 <Authentication> 項目並修改設定如下:
<Security>
<Extension Name="Forms"
Type="Microsoft.Samples.ReportingServices.CustomSecurity.Authorization,
Microsoft.Samples.ReportingServices.CustomSecurity" >
<Configuration>
<AdminConfiguration>
<UserName>username</UserName>
</AdminConfiguration>
</Configuration>
</Extension>
</Security>
<Authentication>
<Extension Name="Forms"
Type="Microsoft.Samples.ReportingServices.CustomSecurity.AuthenticationExtension,
Microsoft.Samples.ReportingServices.CustomSecurity" />
</Authentication>
若要修改 RSWebApplication.config 檔
- 下一步您需要開啟「報表管理員」組態檔 RSWebApplication.config,位於 <install>\ReportManager 目錄。
- 找出 <UI> 項目並更新如下:
<UI>
<CustomAuthenticationUI>
<loginUrl>/Pages/UILogon.aspx</loginUrl>
<UseSSL>True</UseSSL>
</CustomAuthenticationUI>
<ReportServerUrl>http://<server>/ReportServer</ReportServerUrl>
</UI>
安全性 如果您是在沒有安裝 SSL 憑證的開發環境中執行範例安全性擴充功能,在之前的組態項目中,您必須變更 <UseSSL> 項目的值為 False。Microsoft 建議您當結合 Reporting Services 和 Forms 驗證時,務必使用 SSL。
為擴充功能新增安全性原則
您需要為自訂安全性擴充功能新增程式碼群組,以為您的擴充功能授予 FullTrust 權限。方法是新增程式碼群組到位於 <install>\ReportServer 目錄的 rssrvpolicy.config 檔。在安全性原則檔案中找出現有的程式碼群組,如下所示在 $CodeGen 的 URL 成員資格的位置,然後在 rssrvpolicy.config 中新增一個項目如下:
<CodeGroup
class="UnionCodeGroup"
version="1"
PermissionSetName="FullTrust">
<IMembershipCondition
class="UrlMembershipCondition"
version="1"
Url="$CodeGen$/*"
/>
</CodeGroup>
<CodeGroup
class="UnionCodeGroup"
version="1"
Name="SecurityExtensionCodeGroup"
Description="Code group for the sample security extension"
PermissionSetName="FullTrust">
<IMembershipCondition
class="UrlMembershipCondition"
version="1"
Url="C:\Program Files\Microsoft SQL Server\MSSQL\Reporting Services\ReportServer
\bin\Microsoft.Samples.ReportingServices.CustomSecurity.dll"
/>
</CodeGroup>
注意 為了簡化,Forms 驗證範例是弱式具名,而且在安全性原則檔案中需要簡單的 URL 成員資格項目。在您的實際執行安全性擴充功能實作中,應該建立強式具名組件,而且在為組件新增安全性原則時應使用強式具名成員資格條件。關於強式具名組件的詳細資料,請參閱 MSDN 網站上的《Creating and Using Strong-Named Assemblies (英文)》,網址為:http://msdn.microsoft.com/library/en-us/cpguide/html/cpconworkingwithstrongly-namedassemblies.asp。
下一步,您需要為「報表管理員」原則檔案 rsmgrpolicy.config 增加 MyComputer 程式碼群組的權限,檔案位於 <install>\ReportManager 目錄。在 rsmgrpolicy.config 中找出下列程式碼群組,並從 Execution 到 FullTrust 變更 PermissionSetName 屬性如下:
<CodeGroup
class="FirstMatchCodeGroup"
version="1"
PermissionSetName="FullTrust"
Description="This code group grants MyComputer code Execution
permission. ">
<IMembershipCondition
class="ZoneMembershipCondition"
version="1"
Zone="MyComputer" />
設定 Web.config 檔
若要使用 Forms 驗證,您需要為「報表管理員」和「報表伺服器」修改 Web.config 檔以變更驗證模式和停用模擬。
若要為報表伺服器修改 Web.config 檔
- 在文字編輯器中開啟 Web.config 檔。在預設狀況下,該檔案位於 <install>\ReportServer 目錄。
- 找出 <identity> 項目並設定 impersonate 屬性為 false。
<identity impersonate="false" />
- 找出 <authentication> 項目並變更 mode 屬性為 Forms。
- 新增下列 <forms> 項目為 <authentication> 項目的子項,並設定 loginUrl、name、timeout 和 path 屬性如下:
<authentication mode="Forms">
<forms loginUrl="logon.aspx" name="sqlAuthCookie" timeout="60"
path="/"></forms>
</authentication>
- 緊接著 <authentication> 項目之後,新增下列 <authorization> 項目。
<authorization>
<deny users="?" />
</authorization>
這會拒絕未驗證使用者存取報表伺服器的權力。先前所建立 <authentication> 項目的 loginUrl 屬性會將未驗證的要求重新導向到 Logon.aspx 頁面。
若要為報表管理員修改 Web.config 檔
- 為「報表管理員」開啟 Web.config。檔案位於 <install>\ReportManager 目錄。
- 找出
<identity impersonate= "true" /> 區段並變更如下以停用模擬:<identity impersonate="false" /> 。
設定匿名驗證
在預設狀況下,Windows 使用者群組 Guests 包括 IUSR_computername 帳戶。此帳戶是用於初始本機登入和檢視 Logon.aspx 頁面。若要支援 Forms 驗證,您需要為 ReportServer 虛擬目錄啟用匿名存取。在預設狀況下,匿名存取是停用的。
若要啟用匿名驗證
- 在 Internet Information Services 中,選取 ReportServer 虛擬目錄,它通常是 [預設 Web 網站] 的成員,並開啟其屬性索引標籤。
- 按一下 [目錄安全設定] 索引標籤。
- 在 [匿名存取及驗證控制] 區段,按一下 [編輯]。
就會出現 [驗證方法] 對話方塊。
- 選取 [匿名存取] 核取方塊。
- 按一下 [確定]。
- 為 Reports 虛擬目錄重複上列步驟。
建立使用者帳戶資料庫
此範例包括資料庫指令碼,檔名為 createuserstore.sql,讓您在 SQL Server 資料庫中為 Forms 範例設定使用者存放區。
若要建立 UserAccounts 資料庫
- 開啟 [Query Analyzer],然後連接到您 SQL Server 的本機執行個體。
- 找出 createuserstore.sql SQL 指令碼檔案。該指令碼檔案在範例專案檔案當中有提供。請注意從頭到尾在指令碼中您必須使用自已的電腦名稱來取代「LocalMachine」。對於 Windows 2003 的使用者,請使用 NT AUTHORITY\NETWORK SERVICE (除了在 IIS 5 相容性模式時) 來取代 LocalMachine\ASPNET。
- 執行查詢來建立 [UserAccounts] 資料庫。
- 結束 Query Analyzer。
測試範例
使用下列程序測試範例擴充功能。您將註冊一位系統管理員使用者,用以在 UserAccounts 資料庫中新增使用者名稱、密碼雜湊和 Salt 值到使用者資料表。您也需要在報表伺服器組態檔中輸入使用者名稱。然後以相同的使用者登入以確保密碼驗證常式可以正確操作,以及報表伺服器可以完整載入擴充功能組件。
若要測試範例安全性擴充功能部署
- 在命令提示字元執行 iisreset.exe 以重新啟動 IIS。
- 開啟 [報表管理員]。經由 Reporting Services 程式功能表或從瀏覽器存取 Reports 虛擬目錄來完成此動作。
- 輸入使用者名稱和密碼然後按一下 [註冊使用者],以新增使用者到帳戶資料庫。
- 開啟 RSReportServer.config 檔。找出 <Security> 項目並新增之前註冊的使用者名稱如下:
<Security>
<Extension Name="Forms"
Type="Microsoft.Samples.ReportingServices.CustomSecurity.Authorization,
Microsoft.Samples.ReportingServices.CustomSecurity" >
<Configuration>
<AdminConfiguration>
<UserName>username</UserName>
</AdminConfiguration>
</Configuration>
</Extension>
</Security>
- 回到 UILogon.aspx 頁面,重新輸入使用者名稱和密碼,然後按一下 [登入]。
您應該可以不受限制的存取到「報表管理員」和報表伺服器。您建立的系統管理員使用者在報表伺服器上和那些本機電腦上的內建系統管理員帳戶有相等的權限。針對此範例的用途,您僅可以有一個使用者指定為系統管理員。一旦您有內建的系統管理員帳戶,您可以註冊額外的使用者並指定他們在報表伺服器中的角色。
注意 建議您將系統管理員使用者新增為官方的「系統管理員」,以及報表伺服器中的「內容管理員」(根目錄) 角色。這可以在報表伺服器資料庫中防止空的安全性描述項。關於「系統管理員」和「內容管理員」角色的詳細資料,請參閱《Reporting Services Books Online》。
使用有自訂安全性的 Web 服務
您可以使用 Forms 驗證的 Web 服務 API 就如同使用 Windows 驗證的一般。不過,在您的 Web 服務程式碼中需要呼叫 LogonUser 並且傳遞目前使用者的憑證。此外,您的 Web 服務用戶端無法從 Internet Explorer 或其他 Web 瀏覽器所提供的自動 Cookie 管理中得到好處。您必須擴充 ReportingService Proxy 類別以包括 Cookie 管理。這可以在 Web 服務類別中覆寫 GetWebRequest 和 GetWebResponse 方法來完成。
關於這個的範例,請參閱 MSDN 網站上的《ReportingService.LogonUser Method (英文)》,網址為:http://msdn.microsoft.com/library/en-us/rsprog/htm/rsp_ref_soapapi_service_lz_3d7q.asp。
偵錯範例擴充功能
在偵錯程式中執行範例擴充功能不僅是疑難排解困難的好方法,也是檢視程式碼並查看報表伺服器驗證和授權發生過程的有效方法。
Microsoft .NET Framework 提供好幾種偵錯工具可協助您分析此範例程式碼。端視您想要完成的是什麼工作,來選擇使用最適合的工具。針對本指南的目的,所選擇的偵錯工具為 Visual Studio .NET 2003。
若要偵錯 Forms 驗證範例程式碼
- 請確認遵循之前的步驟並且部署範例。
- 啟動 Visual Studio .NET 2003 並在您的測試報表伺服器上開啟 CustomSecurity.sln。
- 當保持在 Visual Studio 中開啟範例程式碼時,開啟 Internet Explorer 並瀏覽到「報表管理員」。
- 瀏覽到 Visual Studio 和自訂安全性擴充功能專案,在程式碼中設定一些中斷點。
- 保持擴充功能專案在作用中的視窗中,按一下 [偵錯] 功能表上的 [處理序]。
顯示 [處理序] 對話方塊。
- 從處理序的清單中,選取 aspnet_wp.exe 處理序 (如果您的應用程式是部署在 IIS 6.0 則請選取 w3wp.exe),按一下 [附加]。當 [附加至處理序] 對話方塊開啟時,請確認有選取 [Common Language Runtime] 程式類型,然後按一下 [確定]。為增強偵錯的效能,請確認 [Native (原生)] 並不是選取的程式類型。
- 現在,以登入的格式輸入使用者憑證並按一下 [登入]。如果程式碼回應到了您的中斷點,偵錯程式會在您的第一個中斷點停止執行。
- 使用 F11 鍵檢視您的程式碼。關於使用 Visual Studio 來偵錯的詳細資訊,請參閱您的 Visual Studio .NET 說明文件。
注意 用這種方式偵錯需要許多資源和處理器時間。如果您遭遇困難,關閉 Visual Studio,重新設定 IIS,然後附加 CustomSecurity 方案到 ASP.NET 背景工作處理序並登入「報表管理員」再重新開始。
移除範例擴充功能
在您嘗試此範例之後有可能還原回 Windows 驗證,但一般並不建議。若要還原到 Windows 安全性,請執行下列步驟:
- 從備份複本中恢復下列檔案:Web.config、RSReportServer.config 和 RSWebApplication.config。如此會將報表伺服器的驗證和授權方法設定為預設的 Windows 安全性。這應該也會移除您為了擴充功能在報表伺服器或「報表管理員」組態檔中所加入的項目。
- 在 Internet Information Services (IIS) 中為報表伺服器虛擬目錄停用匿名存取。
在組態資訊移除之後,您的安全性擴充功能就不再適用於報表伺服器。您並不需要移除在範例安全性擴充功能下執行報表伺服器時所建立的任何安全性描述項。當 Windows 驗證啟用時,報表伺服器會自動指定「系統管理員」角色給報表伺服器所在電腦上的 BUILTIN\Administrators 群組。不過,您必須為 Windows 使用者手動重新套用所有的角色架構安全性。
再說一次,在轉換到不同的安全性擴充功能之後要再還原回 Windows 驗證,一般是不建議的。如果您如此做,當您嘗試存取在報表伺服器資料庫中有自訂安全性描述項、但是沒有 Windows 驗證安全性描述項的項目時,您可能會遇到錯誤。
結論
Microsoft SQL Server 2000 Reporting Services 是用於企業報表開發和部署的可擴充報表平台。Reporting Services 包括 Windows 驗證模型,使用 Windows 帳戶來保障存取到報表伺服器的安全,但是在某些例子中,您可能需要支援不同的安全性模組。若要這麼做,Reporting Services 包括一組安全性擴充功能 API,支援建立自訂安全性擴充功能。在此範例中,提供經由 Forms 驗證實作自訂安全性的方法。Microsoft 經由使安全性擴充功能適用目前和未來的 Reporting Services 版本,來致力於滿足在企業中所涉及的安全性案例。對開發人員而言,您應該注意到實作自訂安全性擴充功能的風險,並應該謹慎考慮報表伺服器所使用安全性系統的確實實作和應用程式。
其他資源
如需詳細資訊,請參閱 MSDN 網站上的下列資源:
|