授權是判斷哪些實體有權變更、檢視或存取計算機資源的程式。 例如,在企業中,只能允許經理存取其員工的檔案。 Windows Communication Foundation (WCF) 支援兩種執行授權處理的機制。 第一個機制可讓您使用現有的 Common Language Runtime (CLR) 建構來控制授權。 第二個是以宣告為基礎的模型,稱為 「身分識別模型」。 WCF 會使用識別模型從傳入訊息建立宣告;身分識別模型類別可以擴充,以支援自定義授權配置的新宣告類型。 本主題概述身分識別模型功能的主要程序設計概念,以及功能所使用的最重要的類別清單。
身分識別模型案例
下列案例代表身分識別模型使用方式。
案例 1:支援身分識別、角色和群組宣告
使用者將訊息傳送至 Web 服務。 Web 服務的訪問控制需求會使用身分識別、角色或群組。 訊息傳送者會對應至一組角色或群組。 角色或群組資訊可用來執行存取檢查。
情境 2:支持詳實主張
使用者將訊息傳送至 Web 服務。 Web 服務的訪問控制需求需要比身分識別、角色或群組更豐富的模型。 Web 服務會使用豐富的宣告型模型,判斷指定的使用者是否可以存取特定受保護的資源。 例如,一位使用者可能能夠讀取其他用戶無法存取的特定資訊,例如薪資資訊。
情境 3:映射不一致的主張
使用者將訊息傳送至 Web 服務。 使用者可以以許多不同的方式指定其認證:X.509 憑證、用戶名稱令牌或 Kerberos 令牌。 不論使用者認證類型為何,Web 服務都必須以相同方式執行訪問控制檢查。 如果一段時間支援其他認證類型,系統應該據此發展。
案例 4:判斷對多個資源的存取
Web 服務會嘗試存取多個資源。 服務會比較與使用者相關聯的宣告與存取資源所需的宣告,以判斷指定使用者可存取哪些受保護的資源。
身分識別模型詞彙
下列清單會定義用來描述身分識別模型概念的重要詞彙。
授權原則
一組規則,用於將一組輸入宣告對應至一組輸出宣告。 評估授權原則會導致權利宣告集被新增至評估內容,然後隨後再新增至授權內容。
授權上下文
一組宣告集合和至少零個或多個屬性。 評估一或多個授權原則的結果。
索賠
宣告類型、權利和值的組合。
權利要求集
由特定簽發者簽發的一組聲明。
索賠類型
一種主張。 由識別模型 API 所定義的宣告是 ClaimType 類別的屬性。 系統提供的宣告類型範例包括Dns、Email、Hash、Name、Rsa、Sid、Spn、System、Thumbprint、Uri和X500DistinguishedName。
評估內容
用于評估授權政策的情境。 包含屬性和權利要求集。 一旦評估完成,就會成為授權上下文的基礎。
身分聲稱
權利以身分識別為基礎的主張。
發行人
包含至少一個身分識別宣告且被視為已發出另一個宣告集的宣告集合。
屬性
與評估內容或授權內容相關聯的一組資訊。
受保護的資源
只有在符合特定需求時,才能對系統中的某些項目進行使用、存取或操作。
正確
對資源的能力。 識別模型 API 所定義的許可權是 Rights 類別的屬性。 系統提供的權限範例為 Identity 與 PossessProperty。
價值觀
權利所涉及的事物。
索賠
身分識別模型是以聲明為基礎的系統。 系統中的某些實體的能力通常由宣稱描述,這些實體通常是該系統的使用者。 與指定實體相關聯的宣告集合可以視為主鍵。 特定索賠定義該鑰匙的形狀,類似於用來開門鎖的實體鑰匙。 要求是用來取得資源的存取權。 存取指定受保護資源的方式是由比較該資源所需的宣告與嘗試存取實體所擁有的宣告來決定。
權利是關於特定數值的表達。 許可權可能是類似「讀取」、「寫入」或「執行」。值可以是資料庫、檔案、信箱或屬性。 聲明也有聲明類型。 索賠類型和權利的組合提供了一種機制,用於指定關於值的能力。 例如,類型為「File」的宣告,在值「Biography.doc」上具有權限「Read」,表示與這類宣告相關聯的實體具有檔案 Biography.doc 的讀取權限。類型為「Name」的宣告,在值「Martin」上具有權限「PossessProperty」,表示與這類宣告相關聯的實體擁有名稱屬性且該值為「Martin」。
雖然各種宣告類型和許可權都定義為身分識別模型的一部分,但系統是可延伸的,可讓各種系統建置在身分識別模型基礎結構之上,視需要定義其他宣告類型和許可權。
身分聲明
其中一個特定的權利是身分識別。 擁有此權利的主張會陳述實體的身份。 例如,類型為「用戶主體名稱」(UPN)的宣告,其值為 someone@example.com,且權限 Identity 表示特定網域中的特定身份。
系統身分識別宣告
識別模型會定義一個身分識別宣告: System。 身分宣告 System 表示實體是當前的應用系統或系統。
索賠集
代表身分識別的宣告模型很重要,因為宣告一律由系統中的某些實體發出,即使該實體最終是「自我」的一些概念也一樣。 索賠會以集合的形式分組在一起,而且每個集合都有發行者。 簽發者只不過是一組聲明。 這種遞歸關係必須最終結束,而且任何索賠集都可以成為自己的簽發者。
下圖顯示三組宣告的範例,其中一組宣告的簽發者是另一組宣告,該組宣告的簽發者則是系統宣告集。 因此,專利要求的集合會形成可能有任意深度的階層。
多個主張集可能具有相同的發出主張的主張集,如下圖所示:
除了宣告集本身的簽發者之外,身分識別模型不會提供任何宣告集形成循環的支援。 因此,永遠不會出現這樣的情況:宣告集 A 是由宣告集 B 所發出,而宣告集 B 本身又由宣告集 A 所發出。 此外,身分識別模型不支援宣告集可由多個簽發者發行。 如果兩個或多個簽發者必須發出一組指定的宣告,則您必須使用多個宣告集,每個宣告都包含相同的宣告,但具有不同的簽發者。
主張的起源
索賠可能來自各種來源。 使用者所提供的認證是一個常見的宣稱來源,例如作為傳送至 Web 服務的訊息的一部分。 系統會驗證這類宣告,並成為與使用者相關聯的一組宣告的一部分。 其他系統元件也可能成為索賠來源,包括但不限於作業系統、網路堆疊、執行環境或應用程式。 此外,遠端服務也可能是索賠的來源。
授權原則
在身分識別模型中,宣稱會作為評估授權政策的過程一部分產生。 授權策略會檢查現有宣告的集合(可能為空),並可以根據已存在的宣告和可用的其他資訊選擇新增其他宣告。 這提供了索賠之間對應的基礎。 系統中是否存在宣告會影響授權原則的行為,不論它是否新增其他宣告。
例如,授權原則可以存取資料庫,其中包含使用系統之各種實體的出生日期。 授權政策會使用該資訊來將「Over18」聲明新增至內容。 請注意,這項超過 18 歲的聲明不會披露該實體的任何信息,除了其年齡已超過 18 歲。 請注意,「Over18」宣告的解譯取決於瞭解該宣告的語意。 新增宣告的授權原則會瞭解某些層級的語意。 後續檢查來自政策評估的索賠結果的程式代碼也應涵蓋這些語義。
有時指定的授權原則可能需要被多次評估,因為當其他授權原則新增宣告時,該授權原則也可能會因此而新增更多的宣告。 身分識別模型的設計目的是要持續進行評估,直到任何正在生效的授權原則不再將宣告新增至內容為止。 此授權原則的持續評估可防止要求強制執行與授權原則相關的任何特定評估順序;它們可以依任何順序進行評估。 例如,如果原則 X 只會在原則 A 新增宣告 B 時新增宣告 Z,則如果先評估 X,則一開始不會新增宣告 Z。接著,會評估 A 並新增宣告 B。X 接著會第二次評估,而這次會新增宣告 Z。
指定的系統可能會有許多授權原則生效。
Key-Making 機器
評估相關聯的授權原則群組就像使用建立密鑰的電腦一樣。 系統會評估每一個授權原則,並產生一組宣告,以構建密鑰結構的形狀。 一旦鑰匙的形狀完成後,就可以用來嘗試開啟一些鎖。 密鑰的形狀會儲存在授權管理員所建立的「授權內容」中。
授權內容
授權管理員會評估各種授權策略,結果是授權上下文(包含一組聲明集和一些相關性屬性)。 您可以檢查授權上下文,以確定該上下文中存在哪些聲明、這些不同聲明之間的關係(例如發行的聲明集),並最終將它們與某些必須滿足的要求進行比較,以訪問資源。
鎖
如果授權內容(一組宣告)是密鑰,那麼必須滿足的條件以授予特定受保護資源存取權,構成密鑰需要匹配的鎖。 身分識別模型不會將這類需求表達方式正規化,但鑒於系統以宣告為基礎的本質,涉及將授權內容中的宣告與一組必要的宣告進行比較。
回顧
身分辨識模型是以主張的概念為基礎。 宣告會分組成集合,並在授權上下文中進行匯總。 授權內容包含一組宣告,而且是評估與授權管理員相關聯的一或多個授權原則的結果。 您可以檢查這些宣告集,以判斷是否符合存取需求。 下圖顯示這些各種身分識別模型概念之間的關聯性。
WCF 和身分識別模型
WCF 會使用身分識別模型基礎結構作為執行授權的基礎。 在 WCF 中,類別 ServiceAuthorizationBehavior 可讓您將 授權 原則指定為服務的一部分。 這類授權原則稱為 外部授權原則,它們可以根據本機原則或透過與遠端服務的互動來執行宣告處理。 由ServiceAuthorizationManager類別代表的授權管理員會同時評估外部授權政策以及辨識各種憑證類型(令牌)的授權政策,並將適合於傳入訊息的宣告填入所謂的授權內容。 授權內容是由 AuthorizationContext 類別表示。
身分識別模型程序設計
下表描述用來對身分識別模型延伸進行程式設計的物件模型。 這些類別全都存在於 System.IdentityModel.Policy 或 System.IdentityModel.Claims 命名空間中。
| 班級 | 說明 |
|---|---|
| 授權元件 | 實作IAuthorizationComponent介面的身份識別模型類別。 |
| IAuthorizationComponent | 提供單一隻讀字串屬性的介面:識別碼。這個屬性的值對於實作這個介面的系統中每個執行個體而言都是唯一的。 |
| AuthorizationContext | 包含一組具有零或多個屬性之實例的ClaimSet;評估一或多個授權原則的結果。 |
| Claim | 索賠型別、權利和值的組合。 右側部分和值部分受限於宣告類型。 |
| ClaimSet | 抽象基類。
Claim 實例的集合。 |
| DefaultClaimSet | 封閉類別。
ClaimSet類別的實作。 |
| EvaluationContext | 抽象基類。 在政策評估期間傳遞至授權政策。 |
| IAuthorizationPolicy | 由 IAuthorizationComponent 授權原則類別衍生和實作的介面。 |
| Rights | 包含預先定義正確值的靜態類別。 |
下列類別也用於身份模型程式設計,但找不到於System.IdentityModel.Policy或System.IdentityModel.Claims命名空間中。
| 班級 | 說明 |
|---|---|
| ServiceAuthorizationManager | 提供方法的類別— CheckAccessCore—用於對服務中的每個操作執行基於宣告的授權檢查。 您必須衍生自 類別並覆寫 方法。 |
| ServiceAuthorizationBehavior | 密封類別,提供與服務行為相關的各種屬性,因為它與授權有關。 |
| ServiceSecurityContext | 類別,提供目前執行中(或即將執行)作業的安全性內容,包括授權內容。 這個類別的實例是的 OperationContext一部分。 |
重要成員
下列成員通常用來建立新的理賠類型。
| 會員 | 說明 |
|---|---|
| CheckAccessCore | 衍生類別會實作此方法,以在服務中執行作業之前先執行宣告型存取檢查。 在做存取檢查決策時,可以檢查在提供的 OperationContext或其他地方的所有資訊。 如果 CheckAccessCore 傳 true回 ,則會授與存取權,並允許執行作業。 如果 CheckAccessCore 傳 false回 ,則會拒絕存取,而且作業不會執行。 如需範例,請參閱 如何:建立服務的自定義授權管理員。 |
| ServiceAuthorizationManager | 傳回服務的ServiceAuthorizationManager。 ServiceAuthorizationManager負責進行授權決策。 |
| ExternalAuthorizationPolicies | 為服務指定的自定義授權原則集合。 除了與傳入訊息中的認證相關的政策之外,也會評估這些政策。 |