使用 Reporting Services 中的窗體身份驗證

發佈日期: 8/18/2004 | 更新日期: 8/18/2004

Microsoft Corporation

適用範圍:
Microsoft® SQL Server™ 2000 Reporting Services

摘要:瞭解有關 Reporting Services 安全擴展方面的知識,着重學習窗體身份驗證。此外,下載和部署 Reporting Services 的窗體身份驗證擴展示例。

*

要安裝示例代碼,請下載 Forms Authentication Sample installer,並在計算機上運行它。

本頁內容
引言 引言
關於本指南 關於本指南
Reporting Services 平臺 Reporting Services 平臺
窗體身份驗證示例 窗體身份驗證示例
結論 結論
參考資料 參考資料

引言

部署安全的分佈式企業報告解決方案是一個極具挑戰性的過程。從報告訪問到提供重要數據(有時是敏感數據)的數據源,您需要針對如何在報告環境中對用戶進行安全的身份驗證和授權作出決策。在安全方面,報告是報告鏈中最薄弱的環節。

所需的安全類型取決於報告環境和已安裝的安全系統類型。Microsoft® Windows® Authentication 是用於確保 Microsoft® SQL Server™ 2000 Reporting Services 中的報告安全性的主要系統。Windows Authentication 提供與其他 Microsoft 服務器產品的緊密集成,由於 Reporting Services 是在 Windows Authentication 上設計和測試的,因此它在這個環境中的安全性最高。

然而,在某些情況下,可能需要對 Reporting Services 安全系統進行擴展,以滿足企業自定義安全的需要。您可以通過功能豐富的 Reporting Services API 開發平臺達到這一目的。本指南將概述 Reporting Services 中的擴展,尤其是安全擴展。您還可以下載適用於 Reporting Services 的示例窗體身份驗證擴展,並對它進行深入研究。隨後,您可以利用 Reporting Services 安全擴展將自定義安全添加到企業報告解決方案中。

關於本指南

本指南中提供的信息旨在:

向您介紹 Reporting Services 安全擴展。

確定在 Reporting Services 中使用自定義身份驗證和授權的位置和方式。

介紹身份驗證和授權在 Reporting Services 中的工作方式。

介紹窗體身份驗證及其實現方式。

爲您提供了一個可以下載和研究的窗體身份驗證示例。

必備知識

本指南未介紹 ASP.NET 安全或窗體身份驗證,未提供有關編程或應用程序安全的深層次知識。作爲一名期望爲 Reporting Services 實現安全擴展的開發人員,您應該對以下一個或多個方面有着深入的瞭解:

Microsoft Reporting Services 功能,尤其是身份驗證、授權和基於角色的安全。

Microsoft .NET Framework。

ASP.NET 和 ASP.NET 安全。

窗體身份驗證。

.NET 語言方面的開發經歷。本文僅提供用 C# 編寫的示例。

要直接瞭解代碼,可以轉到“窗體身份驗證示例”部分。不過,您可能會發現前面的幾部分很有幫助,這些部分介紹了您將使用的某些技術以及如何將這些技術組合在一起使用。

Reporting Services 平臺

通過 Reporting Services,可在整個企業中設計、部署和交付報告。從開發人員的角度來看,Reporting Services 通過 .NET Framework 和 Web service 的關鍵開發平臺提供了各種編程機會。Reporting Services 可以通過“隨手可用”的方式進行部署,從而可以在任何公司中提供全面的報告解決方案。然而,Reporting Services 的開放式和可擴展編程體系結構使它已不再是一個現成的產品,而更像是開發人員以及最終用戶的報告平臺。

擴展 Reporting Services

Reporting Services 具有可擴展性。通過託管代碼 API,可以開發、安裝和管理許多 Reporting Services 組件使用的擴展。可以使用 .NET Framework 創建專用或共享的程序集,並添加新的 Reporting Services 功能以滿足日益增長的業務需求。開發人員可通過以下方式擴展 Reporting Services:

除了 Reporting Services 當前附帶的 Microsoft SQL Server、Oracle 和 OLE DB 提供程序以外,創建其他數據處理擴展。數據處理擴展可用於從您自己特有的數據源中讀取數據,並可用於在創建和篩選數據集時併入其他業務邏輯。

除了 Reporting Services 當前附帶的電子郵件和文件共享交付擴展以外,創建其他交付擴展。交付擴展可用於向傳真機、尋呼機、打印機等設備交付報告。

除 Reporting Services 已經附帶的呈現擴展之外,創建其他呈現擴展。

除了 Windows Authentication 擴展(它當前是該產品的默認安全機制)之外,創建其他安全擴展。

如前所述,本指南主要介紹瞭如何通過窗體身份驗證擴展 Reporting Services 的安全系統。

安全擴展

通過 Reporting Services 安全擴展,可以對用戶或組進行身份驗證和授權,即它使不同的用戶能夠登錄到報告服務器,並根據他們的身份執行不同的任務或操作。默認情況下,Reporting Services 使用基於 Windows 的身份驗證擴展,該身份驗證擴展使用 Windows 帳戶協議驗證聲稱擁有該系統帳戶的用戶的身份。Reporting Services 使用基於角色的安全系統對用戶進行授權。Reporting Services 基於角色的安全模式類似於其他技術的基於角色的安全模式。由於安全擴展基於開放式、可擴展的 API,因此可以在 Reporting Services 中創建新身份驗證和授權擴展。以下是使用基於窗體的身份驗證和授權的安全擴展實現的典型示例:

ufairs01

1如圖所示,身份驗證和授權按如下過程進行:

1.

用戶嘗試通過輸入 URL 來訪問 Report Manager,然後被重定向到一個爲客戶端應用程序收集用戶憑據的窗體。

2.

該用戶將憑據提交給窗體。

3.

通過 LogonUser 方法將該用戶的憑據提交給 Reporting Services Web service。

4.

Web service 調用客戶提供的安全擴展,並驗證自定義安全機構中是否存在該用戶名和密碼。

5.

進行身份驗證時,Web service 將創建身份驗證票據(稱作“Cookie”),管理該票據,並驗證該用戶的角色能否訪問 Report Manager 的主頁。

6.

Web service 將 Cookie 返回給瀏覽器,並在 Report Manager 中顯示相應的用戶界面。

7.

身份驗證結束後,瀏覽器向 Report Manager 發出請求,同時在 HTTP 標頭中傳輸此 Cookie。這些請求是爲響應 Report Manager 應用程序中的用戶操作而發出的。

8.

該 Cookie 連同請求的用戶操作在 HTTP 標頭中一起被傳輸到 Web service。

9.

Cookie 將接受驗證,如果它有效,報告服務器將從報告服務器數據庫中返回與請求操作相關的安全描述符和其他信息。

10.

如果 Cookie 有效,報告服務器將調用安全擴展,以檢查該用戶是否有權執行特定的操作。

11.

如果該用戶已被授權,報告服務器將執行請求的操作,並將控制返回給調用方。

12.

該用戶經過身份驗證後,對報告服務器的 URL 訪問將使用相同的 Cookie。該 Cookie 在 HTTP 標頭中傳輸。

13.

用戶繼續在報告服務器上請求操作,直至會話結束。

何時實現安全擴展

Microsoft 建議您儘可能地使用 Windows Authentication。不過,但在以下兩種情況下,應使用 Reporting Services 的自定義身份驗證和授權:

Internet 或 Extranet 應用程序未使用或無法使用 Windows 帳戶。

您具有自定義的用戶和角色,並且需要在 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 聯機叢書。

Reporting Services 中的身份驗證

身份驗證是建立用戶身份權限的過程。有許多方法可用於用戶身份驗證。最常用的方法是使用密碼。實現窗體身份驗證時,應使用這樣的實現:請求用戶提供憑據(一般通過要求輸入登錄名和密碼的某種界面),然後根據用戶存儲(例如,數據庫表或配置文件)驗證用戶。如果憑據無法得到驗證,身份驗證進程將失敗,用戶將獲取匿名身份。

在 Reporting Services 中,Windows 操作系統通過集成的安全性或通過用戶憑據的顯式接收和驗證來處理用戶的身份驗證。可對 Reporting Services 中的自定義身份驗證進行開發,使之支持其他身份驗證方案。爲此,可使用安全擴展接口 IAuthenticationExtension。所有擴展都繼承於 IExtension,它是報告服務器部署和使用的任何擴展的基本接口。IExtensionIAuthenticationExtensionMicrosoft.ReportingServices.Interfaces 命名空間的成員。

LogonUser 方法是 Reporting Services 中所有身份驗證的核心。可使用它將用戶憑據傳遞給報告服務器進行驗證。基礎安全擴展實現包含自定義身份驗證代碼的 IAuthenticationExtension.LogonUser。在窗體身份驗證示例(將在本指南後面部分介紹)中,LogonUser 根據提供的憑據和數據庫中的自定義用戶存儲區執行身份驗證檢查。在窗體身份驗證示例中,它類似於以下過程:

AuthenticationExtension.cs(窗體身份驗證示例)中

public bool LogonUser(string userName, string password, string authority)
{
   return AuthenticationUtilities.VerifyPassword(userName, password);
}

AuthenticationUtilities.cs(窗體身份驗證示例)中

internal static bool VerifyPassword(string suppliedUserName,
   string suppliedPassword)
{ 
   bool passwordMatch = false;
   // 基於用戶名從數據庫中獲取 Salt 和密碼。
   // 請參閱“How To:Use DPAPI (Machine Store) from ASP.NET”、“How To:
   // Use DPAPI (User Store) from Enterprise Services”和“How To:
   // Create a DPAPI Library”,以瞭解有關如何使用
   // DPAPI 安全地存儲連接字符串的詳細信息。
   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(); // 跳轉到唯一行
      // 從返回的數據流返回輸出參數
      string dbPasswordHash = reader.GetString(0);
      string salt = reader.GetString(1);
      reader.Close();
      // 現在採用用戶輸入的 Salt 和密碼
      // 並將它們串聯在一起。
      string passwordAndSalt = String.Concat(suppliedPassword, salt);
      // 現在對它們進行哈希操作
      string hashedPasswordAndSalt =
         FormsAuthentication.HashPasswordForStoringInConfigFile(
         passwordAndSalt,
         "SHA1");
      // 現在驗證它們。如果它們相等,則返回 true
      passwordMatch = hashedPasswordAndSalt.Equals(dbPasswordHash);
   }
   catch (Exception ex)
   {
       throw new Exception("Exception verifying password. " +
          ex.Message);
   }
   finally
   {
       conn.Close();
   }
   return passwordMatch;
}

身份驗證流程

Reporting Services Web service 提供自定義身份驗證,以便 Report Manager 和報告服務器能夠進行窗體身份驗證。

Reporting Services Web service 的 LogonUser 方法用於將憑據提交給報告服務器,以進行身份驗證。Web service 使用 HTTP 標頭將身份驗證票據(稱爲“Cookie”)從服務器傳遞到客戶端,以響應已驗證的登錄請求。

下圖描述了當使用配置爲使用自定義身份驗證擴展的報告服務器來部署您的應用程序時,對要訪問 Web service 的用戶進行身份驗證的方法。

ufairs02

2如圖 2 所示,身份驗證進程如下:

1.

客戶端應用程序調用 Web service 方法 LogonUser 對用戶進行身份驗證。

2.

Web service 調用安全擴展(具體而言,是指實現 IAuthenticationExtension 的類)的 LogonUser 方法。

3.

LogonUser 的實現驗證用戶存儲或安全機構中的用戶名和密碼。

4.

身份驗證成功後,Web service 將創建 Cookie 並針對會話對其進行管理。

5.

Web service 通過 HTTP 標頭將身份驗證票據返回給調用的應用程序。

Web service 通過安全擴展成功對用戶進行身份驗證後,將生成一個 Cookie,用於隨後的請求。由於報告服務器沒有安全機構,因此該 Cookie 不會一直保存在自定義安全機構中。Cookie 從 Web service 方法 LogonUser 返回,並用於隨後的 Web service 方法調用以及 URL 訪問。

安全:爲了避免在傳輸過程中泄露 Cookie,應使用安全套接字層 (SSL) 加密安全地傳輸從 LogonUser 返回的 Cookie。

如果在安裝了自定義安全擴展的情況下通過 URL 訪問來訪問報告服務器,則 Internet 信息服務 (IIS) 和 ASP.NET 將自動管理身份驗證票據的傳輸。如果通過 SOAP API 訪問報告服務器,則代理類的實現必須包含對身份驗證票據管理的附加支持。有關使用 SOAP API 和管理身份驗證票據的詳細信息,請參閱本指南後面的“將 Web service 用於自定義安全”。

Reporting Services 中的身份驗證

授權是指決定是否爲某一身份授予請求類型的訪問權限(訪問報告服務器數據庫中的給定資源的權限)的過程。Reporting Services 使用基於角色的授權體系結構,即,基於應用程序中的用戶角色授予用戶訪問給定資源的權限。Reporting Services 的安全擴展包含授權組件(一旦用戶在報告服務器上得到驗證,該授權組件便用於授予用戶權限)的實現。當用戶試圖通過 SOAP API 和通過 URL 訪問對系統或報告服務器項目執行操作時,授權便被調用。爲此,可以使用安全擴展接口 IAuthorizationExtension。如前所述,所有擴展都繼承於 IExtension,它是部署的任何擴展的基本接口。IExtensionIAuthorizationExtensionMicrosoft.ReportingServices.Interfaces 命名空間的成員。

在授權中,任何自定義安全實現的關鍵是訪問權檢查,該檢查在方法 CheckAccess 中進行。每當用戶試圖在報告服務器上進行操作時,CheckAccess 便會被調用。CheckAccess 方法將針對每種操作類型進行重載。對於文件夾操作,訪問權檢查的示例可能如下所示:

// 針對文件夾操作重載
public bool CheckAccess(
   string userName, 
   IntPtr userToken, 
   byte[] secDesc, 
   FolderOperation requiredOperation)
{
   // 如果用戶是管理員,則允許無限制訪問。
   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,表明訪問權限被拒絕。

安全描述符

爲報告服務器數據庫中的項目設置授權策略時,客戶端應用程序(例如 Report Manager)將把用戶信息以及項目的安全策略提交給安全擴展。此安全策略和用戶信息統稱爲安全描述符。安全描述符包含報告服務器數據庫中的項目的以下信息:

對項目具有某種操作權限的組或用戶。

項目的類型。

控制項目訪問權的隨機訪問控制列表。

安全描述符是通過 Web service 方法 SetPoliciesSetSystemPolicies 創建的。有關這些方法和 Web service 的詳細信息,請參閱 Reporting Services 聯機叢書。

授權流程

Reporting Services 授權由當前在配置爲在服務器上運行的安全擴展控制。授權是基於角色的,並受限於 Reporting Services 安全體系結構提供的權限和操作。下圖說明了如何授權用戶對報告服務器數據庫中的項目執行操作。

ufairs03

3如圖 3 所示,授權按照以下順序進行:

1.

身份驗證完成後,客戶端應用程序通過 Reporting Services Web service 方法向報告服務器發出請求。身份驗證票據以每個 Web 請求的 HTTP 標題中的 Cookie 的形式傳遞給報告服務器。

2.

在進行任何訪問權檢查之前,Cookie 將被驗證。

3.

完成 Cookie 的驗證後,報告服務器將調用 GetUserInfo,以便向用戶授予標識。

4.

用戶通過 Reporting Services Web service 嘗試操作。

5.

報告服務器調用 CheckAccess 方法,

6.

並隨即檢索安全描述符,並將其傳遞給 CheckAccess 的自定義安全擴展實現。此時,用戶、組或計算機將與訪問的項目的安全描述符進行比較,並被授予執行請求操作的權限。

7.

如果用戶得到授權,Web service 將執行操作,並向調用應用程序返回響應。

窗體身份驗證示例

如果您尚未安裝窗體身份驗證示例,請下載 Forms Authentication Sample installer,並在計算機上運行它,以安裝示例代碼。

關於該示例

窗體身份驗證示例安全擴展可作爲本指南的一部分下載,它使用窗體身份驗證以及 SQL Server 提供與 Reporting Services 一起使用的自定義安全模式。本示例僅用於演示目的,而不適用於生產環境,也未在生產環境中進行測試。Microsoft 對此示例不提供技術支持。在某些情況下,該示例中演示了最佳做法(例如,創建單向哈希、帶salt 的密碼)。在其他情況下,爲簡單起見,而回避了最佳做法。應注意,該示例安全擴展的設置和管理經常要求您在報告服務器計算機上擁有管理員訪問權。不管怎樣,都不建議在連接環境中的生產服務器上使用該示例。

如果您對 Reporting Services 安全擴展有任何疑問,請與 Microsoft 諮詢服務 (MCS)、主要支持服務 (PSS) 或其他 Microsoft 支持服務代表聯繫。

要求

要使用本示例,必須安裝了以下工具:

安裝了 Microsoft SQL Server 2000 Reporting Services 的報告服務器。

用於訪問 Report Manager 的 Microsoft Internet Explorer 6.0 或更高版本。

安裝了 Microsoft® Visual Studio® .NET 2003 的開發計算機。

注意事項

實現自定義安全擴展或使用該示例時,請注意以下事項:

不能在混和模式安全系統(例如,同時使用 Windows Authentication 和窗體身份驗證)下運行報告服務器。這也適用於任何 ASP.NET 應用程序。

務必保存因配置該示例而更改的所有配置文件的備份副本。

儘管可以在部署該示例後恢復到 Windows Authentication,但這可能有一定難度。有關詳細信息,請參閱本指南後面的“刪除示例擴展”。

覆蓋 Windows Authentication 是非常危險的。報告服務器在安全方面具有可擴展性,但僅使用了 Windows Authentication 對它進行了全面測試和支持。

請始終將安全套接字層 (SSL) 用於窗體身份驗證。

在本示例中,用戶輸入傳遞到 Transact-SQL 命令,以進行身份驗證。在您自己的自定義安全擴展(將窗體身份驗證和 SQL Server 配合使用)中,應謹慎對待用戶輸入驗證,並確保結果命令不包含語法錯誤。應確保驗證所有用戶輸入,以防惡意用戶導致應用程序運行任意的 SQL 命令(也稱爲“SQL 插入攻擊”)。登錄進程中驗證提供的用戶名尤爲重要,因爲報告服務器自定義安全模式完全取決於能否對用戶進行正確的標識、身份驗證和授權。

在自定義用戶存儲中,避免用戶輸入帶有以下字符的名稱:: ? ; @ & = + $ , / * > < | . " /。帶有這些字符的用戶名可能會導致“My Reports”(我的報告)功能出現問題,因爲文件夾在服務器中是使用用戶名創建的,且這些字符可能導致文件夾名稱和文件夾路徑出現問題。示例代碼使用正則表達式測試用戶名是否有效,並確保路徑名不超過允許的最大路徑長度。應該在自定義身份驗證代碼中執行類似的驗證。

窗體身份驗證

窗體身份驗證是一種 ASP.NET 身份驗證,通過這種身份驗證,可將未經身份驗證的用戶定向到 HTML 窗體。當用戶提供憑據後,系統將發出包含身份驗證票據的 Cookie。在隨後的請求中,系統首先檢查該 Cookie,確定報告服務器是否已對用戶進行身份驗證。

Reporting Services 本身不支持窗體身份驗證。不過,可使用 Reporting Services API 提供的安全擴展接口對 Reporting Services 進行擴展,使其支持窗體身份驗證。如果將 Reporting Services 擴展爲可以使用窗體,請將安全套接字層 (SSL) 用於所有與報告服務器進行的通信,以防惡意用戶獲取對其他用戶的 Cookie 的訪問權。SSL 可使客戶端和報告服務器相互進行身份驗證,並確保其他計算機無法讀取這兩臺計算機之間的通信內容。通過 SSL 連接從客戶端發出的所有數據都經過加密,這樣,惡意的用戶便無法截獲發送至報告服務器的密碼或數據。

實現窗體身份驗證通常是爲了支持非 Windows 帳戶和身份驗證。圖形界面將展示給請求訪問報告服務器的用戶,提供的憑據將提交給安全機構,以進行身份驗證。

當有交互式用戶輸入憑據時,窗體身份驗證方案就會派上用場。不過,對於與 Reporting Services Web service 直接通信的無人值守應用程序,必須將窗體身份驗證與自定義身份驗證方案組合使用。

以下情況下,窗體身份驗證適用於 Reporting Services:

需要對沒有 Microsoft Windows 帳戶的用戶進行存儲和身份驗證,並

需要在 Web 站點的不同頁面間提供您自己的用戶界面窗體作爲登錄頁面。

編寫支持窗體身份驗證的自定義安全擴展時,請考慮以下事項:

如果使用窗體身份驗證,則必須在 Internet 信息服務 (IIS) 中的報告服務器虛擬目錄上啓用匿名訪問。

必須將 ASP.NET 身份驗證設置爲“Forms”(窗體)。可以在報告服務器的 Web.config 文件中配置 ASP.NET 身份驗證。

Reporting Services 可使用 Windows Authentication 或自定義身份驗證對用戶進行身份驗證和授權。Reporting Services 不支持同時使用多個安全擴展。

部署示例

要運行和檢查窗體身份驗證示例的代碼,必須先執行幾個步驟。執行安裝和配置步驟後,即可在報告服務器上使用或調試示例,或在 Visual Studio .NET 中查看示例代碼。

編譯和安裝擴展程序集

必須按照以下步驟編譯和安裝擴展。這些步驟假設您已將 Reporting Services 安裝到默認位置:C:/Program Files/Microsoft SQL Server/MSSQL/Reporting Services。該位置在本指南的餘下部分統稱爲 <install>

使用 Visual Studio .NET 編譯示例

1.

在 Microsoft Visual Studio .NET 2003 中打開 CustomSecurity.sln。如果已經下載了源代碼並將示例安裝到默認位置,便可以在 C:/Program Files/Microsoft SQL Server/MSSQL/Reporting Services/Samples/Extensions 中訪問到它。

2.

在“解決方案資源管理器”中,選擇 CustomSecurity 項目。

3.

在“項目”菜單上,單擊“添加引用”。

4.

“添加引用”對話框將打開。

5.

單擊“.NET”選項卡。

6.

單擊“瀏覽”進行導航,以在本地驅動器上找到 Microsoft.ReportingServices.Interfaces。默認情況下,該程序集位於 <install>/ReportServer/bin 目錄中。單擊“確定”。

選定的引用被添加至項目中。

7.

在“生成”菜單中單擊“生成解決方案”。

8.

將 Microsoft.Samples.ReportingServices.CustomSecurity.dll 和 Microsoft.Samples.ReportingServices.CustomSecurity.pdb 複製到 <install>/ReportServer/bin 目錄中。

9.

將 Microsoft.Samples.ReportingServices.CustomSecurity.dll 和 Microsoft.Samples.ReportingServices.CustomSecurity.pdb 複製到 <install>/ReportManager/bin 目錄中。

10.

將 Logon.aspx 頁複製到 <install>/ReportServer 目錄中,並將 UILogon.aspx 頁複製到 <install>/ReportManager/Pages 目錄中。

將該擴展添加到配置文件中。

將程序集和登錄頁體身份驗證適用於 Report,需要對 Report Server 和 Report Manager 配置文件做一些修改。

要點:在進行任何更改前,請備份所有配置文件。

修改 RSReportServer.config 文件

1.

使用 Visual Studio .NET 或一個簡單的文本編輯器(例如,記事本)打開 RSReportServer.config 文件。RSReportServer.config 位於 <install>/ReportServer 目錄中。

2.

找到 <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 文件

1.

然後,需要打開位於 <install>/ReportManager 目錄中的 Report Manager 配置文件 RSWebApplication.config。

2.

找到 <UI> 元素,並按如下方式更新它:

<UI>
   <CustomAuthenticationUI>
      <loginUrl>/Pages/UILogon.aspx</loginUrl>
         <UseSSL>True</UseSSL>
   </CustomAuthenticationUI>
   <ReportServerUrl>http://<server>/ReportServer</ReportServerUrl>
</UI>

安全:如果在未安裝 SSL 證書的開發環境中運行示例擴展,則必須在上一個配置項中將 <UseSSL> 元素的值更改爲 False。將 Reporting Services 和窗體身份驗證組合使用時,Microsoft 建議您始終使用 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="示例安全擴展的代碼組"
   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>

注意:爲簡單起見,窗體身份驗證示例命名不是很嚴格,在安全策略文件中要求的 URL 成員身份項也很簡單。在生產安全擴展實現中,應該創建強名稱程序集,並在添加程序集的安全策略時使用強名稱成員身份條件。有關強名稱程序集的詳細信息,請參閱 MSDN 上的“Creating and Using Strong-Named Assemblies”,其網址爲 http://msdn.microsoft.com/library/en-us/cpguide/html/cpconworkingwithstrongly-namedassemblies.asp(英文)。

然後,需要在 <install>/ReportManager 目錄中的 Report Manager 策略文件中爲 MyComputer 代碼組增加權限。在 rsmgrpolicy.config 中找到以下代碼組,並按如下方式將 PermissionSetName 屬性從 Execution 更改爲 FullTrust

<CodeGroup 
        class="FirstMatchCodeGroup" 
        version="1" 
        PermissionSetName="FullTrust"
        Description="該代碼組爲 MyComputer 代碼授予 Execution 
權限。 ">
    <IMembershipCondition 
            class="ZoneMembershipCondition"
            version="1"
            Zone="MyComputer" />

配置 Web.config 文件

要使用窗體身份驗證,您需要修改 Report Manager 和 Report Server 的 Web.config 文件,以更改身份驗證並禁用模擬。

修改 Report Server Web.config 文件

1.

在文本編輯器中打開 Web.config 文件。默認情況下,該文件位於 <install>/ReportServer 目錄中。

2.

找到 <identity> 元素,並將 impersonate 屬性設置爲 false

<identity impersonate="false" />

3.

找到 <authentication> 元素,並將 mode 屬性更改爲 Forms

4.

將以下 <forms> 元素作爲 <authentication> 元素的子級添加,並按如下方式設置 loginUrlnametimeoutpath 屬性:

<authentication mode="Forms">
   <forms loginUrl="logon.aspx" name="sqlAuthCookie" timeout="60" 
               path="/"></forms>
   </authentication>

5.

將以下 <authorization> 元素直接添加到 <authentication> 元素之後。

<authorization> 
   <deny users="?" />
</authorization>

這會拒絕將訪問報告服務器的權限授予未經身份驗證的用戶。<authentication> 元素的先前建立的 loginUrl 屬性將把未經身份驗證的用戶重定向到 Logon.aspx 頁上。

修改 Report Manager Web.config 文件

1.

打開 Report Manager 的 Web.config。它位於 <install>/ReportManager 目錄中。

2.

找到 <identity impersonate= "true" /> 部分,然後按如下方式更改它,以便禁用模擬:<identity impersonate="false" />。

配置匿名身份驗證

默認情況下,Windows 用戶組 Guests 包含 IUSR_computername 帳戶。該帳戶用於最初的本地登錄以及查看 Logon.aspx 頁。要支持窗體身份驗證,必須啓用 ReportServer 虛擬目錄的匿名訪問。默認情況下,匿名訪問被禁用。

啓用匿名身份驗證

1.

在“Internet 信息服務”中,選擇 ReportServer 虛擬目錄(通常是默認網站的成員),然後打開它的屬性選項卡。

2.

單擊“目錄安全性”選項卡。

3.

在“匿名訪問和身份驗證控制”部分,單擊“編輯”。

將顯示“身份驗證方法”對話框。

4.

選中“匿名訪問”複選框。

5.

單擊“確定”。

6.

對 Reports 虛擬目錄重複上述步驟。

創建用戶帳戶數據庫

示例包含一個數據庫腳本,即 createuserstore.sql,用於在 SQL Server 數據庫中爲窗體示例建立一個用戶存儲。

創建 UserAccounts 數據庫

1.

打開“查詢分析器”,然後連接到 SQL Server 的本地實例。

2.

找到 SQL 腳本文件 createuserstore.sql。該腳本文件包含在示例項目文件中。注意,在腳本的結尾處,必須用您自己的計算機名替換“LocalMachine”。對於 Windows 2003 用戶,用 NT AUTHORITY/NETWORK SERVICE 替換 LocalMachine/ASPNET(在 IIS 5 兼容模式下時除外)

3.

運行查詢以創建 UserAccounts 數據庫。

4.

退出“查詢分析器”。

測試示例

通過以下步驟測試示例擴展。註冊管理員用戶,即將該用戶名、密碼哈西和 Salt 值添加到 UserAccounts 數據庫中的用戶表。它還將要求您在報告服務器配置文件中輸入該用戶名。然後,您將以同一個用戶身份登錄以確保報告服務器正確運行密碼驗證例程以及正確加載擴展程序集。

測試示例安全擴展部署

1.

在命令提示符下運行 iisreset.exe,重新啓動 IIS。

2.

打開 Report Manager。您可以從 Reporting Services 程序菜單打開它或通過從瀏覽器訪問 Reports 虛擬目錄來打開它。

3.

輸入用戶名和密碼,然後單擊“註冊用戶”,將用戶添加到帳戶數據庫中。

4.

打開 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>

5.

返回到 UILogon.aspx 頁,重新輸入用戶名和密碼,然後單擊“登錄”。

您應該能夠不受限制地訪問 Report Manager 和報告服務器。創建的管理員用戶對報告服務器的權限與對本地計算機上的內置管理員帳戶的權限相同。在本示例中,只能將一位用戶指定爲管理員。擁有內置管理員帳戶後,即可註冊其他用戶,並指派他們在報告服務器中的角色。

注意:建議將管理員用戶添加到報告服務器的正式 System Administrator 和 Content Manager(根文件夾)角色中。這可防止報告服務器數據庫中出現空的安全描述符。有關 System Administrator 和 Content Manager 角色的詳細信息,請參閱 Reporting Services 聯機叢書。

將 Web Service 用於自定義安全

您可以將 Web service API 用於窗體身份驗證,就像將 Windows Authentication 用於窗體身份驗證一樣。不過,您必須調用 Web service 代碼中的 LogonUser,並傳遞當前用戶的憑據。此外,Web service 客戶端將不具備 Internet Explorer 或其他 Web 瀏覽器提供的自動 Cookie 管理功能。您必須擴展 ReportingService 代理類以包含 Cookie 管理。爲此,可以覆蓋 Web service 類的 GetWebRequestGetWebResponse 方法。

有關這方面的示例,請參閱 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。

調試窗體身份驗證示例代碼

1.

確保按照以下步驟部署示例。

2.

啓動 Visual Studio .NET 2003,並打開測試報告服務器上的 CustomSecurity.sln。

3.

打開 Internet Explorer,並導航至 Report Manager,同時使示例代碼在 Visual Studio 中保持打開狀態。

4.

導航至 Visual Studio 和自定義安全擴展項目,並在代碼中設置一些斷點。

5.

當擴展項目仍爲活動窗口時,單擊“調試”菜單上的“進程”。

“進程”對話框將打開。

6.

從進程列表中,選擇 aspnet_wp.exe 進程(如果您的應用程序部署在 IIS 6.0 上,請選擇 w3wp.exe),然後單擊“附加”。當“附加到進程”對話框打開時,確保選擇了程序類型“公共語言運行庫”,然後單擊“確定”。爲提高調試性能,確保未選擇程序類型“本機”。

7.

現在,請在登錄窗體中輸入用戶憑據,然後單擊“登錄”。如果遇到對應於斷點的代碼,調試程序將在第一個斷點處停止執行。

8.

使用 F11 鍵瀏覽代碼。有關使用 Visual Studio 進行調試的詳細信息,請參閱 Visual Studio .NET 文檔。

注意:以這種方式進行調試需要大量的資源和處理器時間。如果遇到問題,請關閉 Visual Studio,重置 IIS,然後通過將 CustomSecurity 解決方案附加到 ASP.NET 工作進程並登錄到 Report Manager 來重新開始。

刪除示例擴展

儘管通常不建議這麼做,但刪除示例後,仍可以恢復到 Windows Authentication。要恢復到 Windows 安全,請執行下列操作:

從備份副本還原下列文件:Web.config、RSReportServer.config 和 RSWebApplication.config。這將把報告服務器的身份驗證和授權方法設置爲默認的 Windows 安全。這還將刪除您在 Report Server 或 Report Manager 配置文件中爲擴展輸入的內容。

在 Internet 信息服務器 (IIS) 中禁用報告服務器虛擬目錄的匿名訪問。

刪除配置信息後,安全擴展對於報告服務器將不可用。您不必刪除在示例安全擴展下運行報告服務器時所創建的任何安全描述符。啓用 Windows Authentication 時,報告服務器自動將 System Administrator 角色分配給託管報告服務器的計算機上的 BUILTIN/Administrators 組。不過,您必須爲 Windows 用戶重新手動應用任何基於角色的安全。

通常,在遷移到不同的安全擴展後,建議您不要恢復到 Windows Authentication。否則,當您試圖訪問報告服務器中的項目時,如果它們具有自定義安全描述符而不具有 Windows Authentication 安全描述符,則可能會遇到錯誤。

結論

Microsoft SQL Server 2000 Reporting Services 是一個可用於企業報告開發和部署的可擴展報告平臺。Reporting Services 包含一個 Windows Authentication 模塊,該模塊使用 Windows 帳戶確保對報告服務器訪問的安全,但在某些情況下,可能需要支持不同安全模塊。爲此,Reporting Services 中包含了一組支持創建自定義安全擴展的安全擴展 API。在所提供的示例中,您已瞭解了通過窗體身份驗證實現自定義安全的方法。Microsoft 正致力於通過在 Reporting Services 的當前版本和後續版本中提供安全擴展性,來滿足企業中不斷增長的安全需求。 作爲開發者,您應該意識到實現自定義安全擴展的風險,並應該謹慎考慮報告服務器所用的安全系統是否得到正確實現和應用。

參考資料

有關詳細信息,請參閱 MSDN 上的以下資源:

How To:Use Forms Authentication with SQL Server 2000(英文)

Forms Authentication Provider(英文)

Using Role-Based Security(英文)

Microsoft.ReportingServices.Interfaces Namespace(英文)

版本所有



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=246265

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章