クレーム チュートリアル: SharePoint 2010 のフォームベース認証 Web アプリケーションのクレーム プロバイダーを作成する
**概要:**Microsoft SharePoint 2010 フォームベース認証 Web アプリケーションのクレーム プロバイダーの作成方法を学びます。
最終更新日: 2015年3月9日
適用対象: Business Connectivity Services | Open XML | SharePoint Designer 2010 | SharePoint Foundation 2010 | SharePoint Online | SharePoint Server 2010 | Visual Studio
この記事の内容
フォームベース認証 Web アプリケーションのクレーム プロバイダーの作成についての概要
シナリオ: クレームを使用して SharePoint リソースにアクセスする
まとめ
付録 A: ID クレームのエンコード文字マップ
その他の技術情報
提供元: Andy Li、Microsoft Corporation
目次
フォームベース認証 Web アプリケーションのクレーム プロバイダーの作成についての概要
シナリオ: クレームを使用して SharePoint リソースにアクセスする
まとめ
付録 A: ID クレームのエンコード文字マップ
その他の技術情報
コードのダウンロード: ClaimsExample-ContosoClaimsProviders (英語)
フォームベース認証 Web アプリケーションのクレーム プロバイダーの作成についての概要
このチュートリアルでは、クレームに関するチュートリアル: カスタムのメンバーシップとロール プロバイダーを使用してクレーム ベースの SharePoint 2010 Web アプリケーション用のフォーム ベース認証を作成する で作成したフォームベース Web アプリケーションのためにサンプルのカスタマー リレーションシップ マネジメント (CRM) クレーム プロバイダーを作成します。次に、このクレーム プロバイダーを修正して (クレーム オーグメントで) アクセス制御リスト (ACL) による SharePoint リソースのアクセス制御に使われるさらに別の CRM クレームを提供します。
既定で、クレームは Microsoft SharePoint Foundation 2010 や Microsoft SharePoint Server 2010 が既定のクレーム プロバイダーからフォームベース認証のために呼び出すインターフェイスを実装しているメンバーシップ プロバイダーやロール プロバイダーで作業を検索して解決します。追加のクレームが必要とされるケースもあります (たとえば、シナリオ セクションで説明する CRM など)。そのような場合には、オーグメント クレーム プロバイダーを使用できます。
"クレーム オーグメント" という用語は、Windows クレーム認証、SAML (Security Assertion Markup Language) サインイン、フォームベース認証など、すべての種類のクレーム認証に適用されます。
注意
クレーム認証の詳細については、「クレームに関するチュートリアル: SharePoint 2010 のクレーム プロバイダーを記述する」を参照してください。
シナリオ: クレームを使用して SharePoint リソースにアクセスする
アカウントの設定が完全に異なる外部 CRM システムがあると仮定します。この CRM システムにログオンするとき、ユーザーは別のユーザー名とパスワードのセットを指定します。ログオン後、この CRM システムは、各ユーザーに対してそのアカウントの設定に基づいて異なる権限を付与します。
たとえば、各 CRM アカウントには、Role と Region という 2 つの属性があります。Role 属性は現在のユーザーが営業担当者、営業課長、重役のいずれであるかを示します。また、Region 属性はユーザーの所在地を示します。
Microsoft SharePoint 2010 には、CRM に関係するドキュメントを格納するサイト コレクションがあります。その考え方は、ユーザーが SharePoint サイトにログオンしたとき、そのロール情報と地域情報を CRM システムから持ってくることで、ユーザーの CRM ロール情報と地域情報に基づいてドキュメントに権限を適用できるようにするというものです。
ステップ 1: プロジェクトを準備する
最初に、SharePoint プロジェクトを準備します。
プロジェクトを準備するには
空の SharePoint プロジェクトを作成します。
プロジェクトの名前を ContosoClaimProviders とします。
デバッグ用の SharePoint サイトを指定するように求められたときは、http://intranet.contoso.com:200 と入力します。この場所でフォームベース認証クレームが有効にされます。
Microsoft.IdentityModel.dll アセンブリへの参照を追加します。
ステップ 2: ユーザー検索関数を追加する
次に、ユーザー情報を検索するための関数を追加します。
ユーザー検索関数を追加するには
クラス ファイル CRMClaimTypes.cs をプロジェクトに追加します。
以下の名前空間を追加します。
using Microsoft.SharePoint.Administration; using Microsoft.IdentityModel.Claims; using System.Collections;
CRMClaimTypes.cs ファイル内のコードを次のコードに置き換えます。CRMClaimType クラスには、現在のクレーム プロバイダーがサポートする 2 つのカスタム クレームが定義されています。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ContosoClaimProviders { public class CRMClaimType { public static string Role = "http://schemas.sample.org/ws/2009/12/identity/claims/CRMRole"; public static string Region = "http://schemas.sample.org/ws/2009/12/identity/claims/CRMRegion"; } }
クラス ファイル CRMUserInfo.cs を追加します。CRMUseInfo クラスは、ユーザー情報の検索サポートを提供します。以下のコードは、デモ用としてのみ使うことを想定して提供されています。実際の運用環境では、ユーザー情報を安全な場所に格納するか、ディレクトリ サービスまたはデータベースを介してデータを検索することを検討してください。
以下のコードを CRMUseInfo クラスに追加します。
private static string[] userDB = { "bob:CRMRole:Reader", "bob:CRMRole:SalesRepresentative", "bob:CRMRegion:Northwest", "mary:CRMRole:Reader", "mary:CRMRole:SalesManager", "mary:CRMRegion:East", "jack:CRMRole:Reader", "jack:CRMRole:Executive", "jack:CRMRegion:East", "admin1:CRMRole:Administrator", "contoso\\andy:CRMRole:SalesManager", contoso\\administrator:CRMRole:SalesManager }; private static string[] claimsDB = {"CRMRole:Reader", "CRMRole:SalesRepresentative", "CRMRole:SalesManager", "CRMRole:Executive", "CRMRole:Administrator", "CRMRegion:Northwest", "CRMRegion:East", };
静的メソッド GetClaimsForUser を追加します。これは特定ユーザーのすべてのクレームを返すユーティリティ メソッドです。
public static List<Claim> GetClaimsForUser(string username) { List<Claim> userClaims = new List<Claim>(); foreach(string userInfo in userDB) { string[] claims = userInfo.Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries); if (username == claims[0]) { userClaims.Add(new Claim(GetClaimTypeForRole(claims[1]), claims[2], Microsoft.IdentityModel.Claims.ClaimValueTypes.String)); } } return userClaims; }
静的メソッド GetAllUsers を追加します。これはユーザーのすべてのアカウント名を返すユーティリティ メソッドです。
// Manually constructs a list of users. In a real-world // production environment, you should look up a directory service // or database to retrieve the user information. public static List<string> GetAllUsers() { List<string> allUsers = new List<string>(); // Add forms users. allUsers.Add("bob"); allUsers.Add("mary"); allUsers.Add("jack"); allUsers.Add("admin1"); // Add Windows domain user if you want this provider // to augment the claims. allUsers.Add("contoso\\andy"); return allUsers; }
次の 2 つのメソッドを CRMUserInfo クラスに追加します。
GetAllClaims メソッドは、このプロバイダーがサポートしている既知のすべてのクレーム値を返します。すべての値は claimsDB 文字列配列で定義されています。
GetClaimTypeForRole ユーティリティ メソッドは、クレームの種類を、その文字列名から実際のクレームの種類に変換します。たとえば、CRMRole は http://schemas.sample.org/ws/2009/12/identity/claims/CRMRole になります。
/// <summary> /// This method returns all the known claims from the CRM system /// so that the claims provider is able to search and resolve /// the claims in People Picker. /// </summary> /// <returns></returns> public static Hashtable GetAllClaims() { Hashtable knownClaims = new Hashtable(); foreach(string claimItem in claimsDB) { string[] claim = claimItem.Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries); knownClaims.Add(claim[1].ToLower(), claim[0].ToLower()); } return knownClaims; } public static string GetClaimTypeForRole(string roleName) { if (roleName.Equals("CRMRole", StringComparison.OrdinalIgnoreCase)) return CRMClaimType.Role; else if (roleName.Equals("CRMRegion", StringComparison.OrdinalIgnoreCase)) return CRMClaimType.Region; else throw new Exception("CRM claim type not found!"); }
ステップ 3: クレーム プロバイダーを作成する
次に、クレーム プロバイダーを実装します。
クレーム プロバイダーを実装するには
クラス ファイル CRMClaimProvider.cs を追加します。
以下の名前空間を追加します。
using Microsoft.SharePoint.Administration.Claims; using Microsoft.IdentityModel.Claims; using System.Collections; using Microsoft.SharePoint.WebControls;
CRMClaimProvider クラスの継承を SPClaimProvider クラスに変更します。
public class CRMClaimProvider : SPClaimProvider
Name プロパティの構造をサポートするために次のコードを追加します。
public CRMClaimProvider(string displayName) : base(displayName) { } public override string Name { get { return "ContosoCRMClaimProvider"; } }
このクラスに以下のコードを追加します。プロパティ名が示すように、このプロパティは個々のメソッドをサポートするために true または false を返します。
注意
階層の実装例については、「クレームに関するチュートリアル: SharePoint 2010 のクレーム プロバイダーを記述する」を参照してください。
/// <summary> /// Return true if you are doing claims augmentation. /// </summary> public override bool SupportsEntityInformation { get { return true; } } /// <summary> /// Return true if you support claims resolution in the People Picker. /// </summary> public override bool SupportsResolve { get { return true; } } /// <summary> /// Return true if you support claims search in the People Picker. /// </summary> public override bool SupportsSearch { get { return true; } } /// <summary> /// Return true if you support hierarchy display in the People Picker. /// </summary> public override bool SupportsHierarchy { get { return false; } } public override bool SupportsUserSpecificHierarchy { get { return base.SupportsUserSpecificHierarchy; } }
このクラスに以下のメソッドを追加します。
FillClaimTypes SharePoint 2010 から呼び出され、クレーム プロバイダーがサポートしているクレームの種類を取得します。
FillClaimValueTypes SharePoint 2010 から呼び出され、そこでサポートされている各クレームの種類に対応するクレーム値の種類を取得します。
FillSchema ユーザー選択ウィンドウから呼び出され、ユーザー選択ウィンドウに表示できる情報を取得します。
FillEntityTypes ユーザー選択ウィンドウにクレーム プロバイダーがサポートしているクレームの種類 (ユーザーまたはロール) を知らせます。
/// <summary> /// Returns all the claim types that are supported by /// this claims provider. /// </summary> /// <param name="claimTypes"></param> protected override void FillClaimTypes(List<string> claimTypes) { if (null == claimTypes) { throw new ArgumentNullException("claimTypes"); } // Add the claim types that will be added by this claims provider. claimTypes.Add(CRMClaimType.Role); claimTypes.Add(CRMClaimType.Region); } /// <summary> /// Return all the claim value types that correspond to the claim /// types. You must return the values in the same order as /// in the FillClaimTypes method. /// </summary> /// <param name="claimValueTypes"></param> protected override void FillClaimValueTypes(List<string> claimValueTypes) { if (null == claimValueTypes) { throw new ArgumentNullException("claimValueTypes"); } claimValueTypes.Add(Microsoft.IdentityModel.Claims.ClaimValueTypes.String); claimValueTypes.Add(Microsoft.IdentityModel.Claims.ClaimValueTypes.String); } /// <summary> /// Required for People Picker. This tells the People Picker what /// information is available for the entity. /// </summary> /// <param name="schema"></param> protected override void FillSchema(SPProviderSchema schema) { schema.AddSchemaElement(new SPSchemaElement(PeopleEditorEntityDataKeys.DisplayName, "DisplayName", SPSchemaElementType.TableViewOnly)); } /// <summary> /// Returns the entity type for the claims that are returned from the /// claims provider. /// </summary> /// <param name="entityTypes"></param> protected override void FillEntityTypes(List<string> entityTypes) { entityTypes.Add(SPClaimEntityTypes.FormsRole); entityTypes.Add(SPClaimEntityTypes.FormsRole); }
クレーム オーグメントをサポートする FillClaimsForEntity メソッドを追加します。このメソッドは、ユーザーの認証後に SharePoint セキュリティ トークン サービス (STS) から呼び出されます。
/// <summary> /// Implement this method if the claims provider supports /// claims augmentation. /// </summary> /// <param name="context"></param> /// <param name="entity"></param> /// <param name="claims"></param> protected override void FillClaimsForEntity(Uri context, SPClaim entity, List<SPClaim> claims) { if (null == entity) { throw new ArgumentNullException("entity"); } if (null == claims) { throw new ArgumentNullException("claims"); } // Add the role claim. SPClaim userIdClaim = SPClaimProviderManager.DecodeUserIdentifierClaim(entity); // Add claims for users. List<string> allCRMUsers = CRMUserInfo.GetAllUsers(); if(allCRMUsers.Contains(userIdClaim.Value.ToLower())) { List<Claim> userClaims = CRMUserInfo.GetClaimsForUser(userIdClaim.Value.ToLower()); foreach(Claim claim in userClaims) { claims.Add(CreateClaim(claim.ClaimType, claim.Value, claim.ValueType)); } } }
クレーム検索をサポートする FillSearch メソッドを追加します。
/// <summary> /// Required if you implement the claims search in the People Picker. /// </summary> /// <param name="context"></param> /// <param name="entityTypes"></param> /// <param name="searchPattern"></param> /// <param name="hierarchyNodeID"></param> /// <param name="maxCount"></param> /// <param name="searchTree"></param> protected override void FillSearch(Uri context, string[] entityTypes, string searchPattern, string hierarchyNodeID, int maxCount, SPProviderHierarchyTree searchTree) { string keyword = searchPattern.ToLower(); Hashtable knownClaims = CRMUserInfo.GetAllClaims(); List<string> knownClaimsList = new List<string>(); // Convert the knownClaims.Key into a List<string> for LINQ query. foreach (string claim in knownClaims.Keys) { knownClaimsList.Add(claim); } var claimQuery = knownClaimsList.Where(claim => claim.IndexOf(keyword) >= 0).Select(claim => claim); foreach (string claimValue in claimQuery) { // Get the ClaimType for the claim type. // For example, if you search "SalesManager", // the ClaimType will be CRMClaimType.Role. string claimType = CRMUserInfo.GetClaimTypeForRole((string)knownClaims[claimValue]); PickerEntity entity = CreatePickerEntity(); entity.Claim = CreateClaim(claimType, claimValue, Microsoft.IdentityModel.Claims.ClaimValueTypes.String); entity.Description = claimValue; entity.DisplayText = claimValue; entity.EntityData[PeopleEditorEntityDataKeys.DisplayName] = claimValue; entity.EntityType = SPClaimEntityTypes.FormsRole; entity.IsResolved = true; searchTree.AddEntity(entity); } }
ユーザー選択ウィンドウでのクレーム解決をサポートする次の 2 つの FillResolve メソッドを追加します。
/// <summary> /// Resolve a single claim by using exact match. This method is required /// for claim search and for claim resolve. /// </summary> /// <param name="context"></param> /// <param name="entityTypes"></param> /// <param name="resolveInput"></param> /// <param name="resolved"></param> protected override void FillResolve(Uri context, string[] entityTypes, SPClaim resolveInput, List<PickerEntity> resolved) { string keyword = resolveInput.Value.ToLower(); Hashtable knownClaims = CRMUserInfo.GetAllClaims(); if (knownClaims.ContainsKey(keyword)) { // Get the ClaimType for the claim type. // For example, if you search "SalesManager", // the ClaimType will be CRMClaimType.Role. // In this case, the keyword is the value of the claim. string claimValue = keyword; string claimType = CRMUserInfo.GetClaimTypeForRole((string)knownClaims[keyword]); PickerEntity entity = CreatePickerEntity(); entity.Claim = CreateClaim(claimType, claimValue, Microsoft.IdentityModel.Claims.ClaimValueTypes.String); entity.Description = claimValue; entity.DisplayText = claimValue; entity.EntityData[PeopleEditorEntityDataKeys.DisplayName] = claimValue; entity.EntityType = SPClaimEntityTypes.FormsRole; entity.IsResolved = true; resolved.Add(entity); } } /// <summary> /// Required if you implement claim resolution in the People Picker. /// </summary> /// <param name="context"></param> /// <param name="entityTypes"></param> /// <param name="resolveInput"></param> /// <param name="resolved"></param> protected override void FillResolve(Uri context, string[] entityTypes, string resolveInput, List<PickerEntity> resolved) { string keyword = resolveInput.ToLower(); Hashtable knownClaims = CRMUserInfo.GetAllClaims(); List<string> knownClaimsList = new List<string>(); // Convert the knownClaims.Key into a List<string> for LINQ query. foreach (string claim in knownClaims.Keys) { knownClaimsList.Add(claim); } var claimQuery = knownClaimsList.Where(claim => claim.IndexOf(keyword) >= 0).Select(claim => claim); foreach (string claimValue in claimQuery) { // Get the ClaimType for the claim type. // For example, if you search "SalesManager", // the ClaimType will be CRMClaimType.Role. string claimType = CRMUserInfo.GetClaimTypeForRole((string)knownClaims[claimValue]); PickerEntity entity = CreatePickerEntity(); entity.Claim = CreateClaim(claimType, claimValue, Microsoft.IdentityModel.Claims.ClaimValueTypes.String); entity.Description = claimValue; entity.DisplayText = claimValue; entity.EntityData[PeopleEditorEntityDataKeys.DisplayName] = claimValue; entity.EntityType = SPClaimEntityTypes.FormsRole; entity.IsResolved = true; resolved.Add(entity); } }
次の FillHierarchy メソッドを追加します。このクラスは抽象クラスに関するすべての関数を実装するために必要とされます。
注意
階層の実装例については、「クレームに関するチュートリアル: SharePoint 2010 のクレーム プロバイダーを記述する」を参照してください。
protected override void FillHierarchy(Uri context, string[] entityTypes, string hierarchyNodeID, int numberOfLevels, SPProviderHierarchyTree hierarchy) { throw new NotImplementedException(); }
プロジェクトをビルドし、エラーを修正します。
ステップ 4: クレーム プロバイダーを配置する
次に、クレーム プロバイダーを配置します。
クレーム プロバイダーを配置するには
Solution Explorer で、フィーチャー ノードの下にフィーチャーを追加します。その名前を CRMClaimProvider に変更します。
CRMClaimProvider を右クリックし、[イベント レシーバーの追加] をクリックします。
フィーチャーのスコープを Farm に変更します。
レシーバー クラス ファイルに名前空間を追加します。
using Microsoft.SharePoint.Administration.Claims;
SPClaimProviderFeatureReceiver からクラスを派生させます。この基底レシーバーは、ファームにクレームを登録する機能を提供します。
public class CRMClaimProviderEventReceiver : SPClaimProviderFeatureReceiver
レシーバーの実装を以下のコードに置き換えます。
private string providerDisplayName = "CRM Claims Provider"; private string providerDescription = "Provides claims from Contoso CRM system"; public override string ClaimProviderAssembly { get { return typeof(ContosoClaimProviders.CRMClaimProvider).Assembly.FullName; } } public override string ClaimProviderType { get { return typeof(ContosoClaimProviders.CRMClaimProvider).FullName; } } public override string ClaimProviderDisplayName { get { return providerDisplayName; } } public override string ClaimProviderDescription { get { return providerDescription; } }
プロジェクトをビルドしてファームに配置します。
ステップ 5: サイトからユーザーを削除する
次に、ユーザーを削除します。
ユーザーを削除するには
http://intranet.contoso.com:200 に移動します。
資格情報 admin1/pass@word1 でログオンします。
[サイトの操作] メニューの [サイトの設定] をクリックします。
[ユーザーと権限] セクションで、[ユーザーとグループ] をクリックします。
左側のナビゲーション ウィンドウで、[その他] をクリックします。
bob、mary、および jack を削除します (存在する場合)。
Employee、TeamManager、および CEO を削除します。
右上隅のドロップダウン リストで [別のユーザーとしてサインイン] をクリックします。
Bob、Mary、または Jack としてログオンしてみます。図 1 のようなエラー メッセージが表示されるはずです。
図 1. アクセス拒否のエラー メッセージ
注意
アクセス拒否のエラー メッセージが表示されない場合は、前のステップに戻り、ステップ 2: ユーザー検索関数を追加する で追加したすべてのユーザーおよびロールを削除したか確認します。
ステップ 6: クレーム検索機能をテストする
次に、クレーム検索機能をテストします。
クレーム検索機能をテストするには
http://intranet.contoso.com:200 に移動します。
資格情報 admin1/pass@word1 でログオンします。
[サイトの操作] メニューの [サイトの権限] をクリックします。
リボン上の [アクセス許可の付与] をクリックします。[アクセス許可の付与] ダイアログ ボックスが表示されます。[ユーザー/グループ] の下に [参照] アイコンがあります (図 2 を参照)。
図 2. [アクセス許可の付与] ダイアログ ボックスと [ユーザー選択ウィンドウ] アイコン
[参照] アイコンをクリックして [ユーザー選択ウィンドウ] ダイアログ ボックスを起動します (図 3 を参照)。
図 3. [ユーザー選択ウィンドウ] ダイアログ ボックス
検索ボックスに sales と入力し、[検索] をクリックします。図 4 のように、2 つの結果が表示されます。
図 4. sales (営業) 関係のクレームの検索
それぞれの結果をダブルクリックして、両方を [追加] フィールドに追加します。
[OK] をクリックして、ユーザー選択ウィンドウを閉じます。salesmanager ロールと salesrepresentative ロールが [ユーザー/グループ] フィールドに追加されます (図 5 を参照)。
[アクセス許可の付与] で、[FBA Site のメンバー [投稿]] を選択します。
図 5. FBA サイト メンバー (投稿者) の選択
[OK] をクリックします。
左側のナビゲーション ウィンドウで、[FBA サイト メンバー] をクリックします。salesmanager ロールと salesrepresentative ロール (クレーム) が [FBA サイト メンバー] グループに追加されています (図 6 を参照)。
図 6. [FBA サイト メンバー] グループの salesmanager および salesrepresentative ロール
右上隅のドロップダウン リストで [別のユーザーとしてサインイン] をクリックします。
Bob または Mary としてログオンしてみます。
次に、Jack としてログオンしてみます。ログオンできますか?ログオンに失敗するのはなぜですか?
資格情報 admin1/pass@word1 でログオンします。
手順 3. ~ 10. を繰り返して、Executive のロールを追加します。
Jack の資格情報でログオンを試み、ログオンに成功するかどうか確認します。
手順 3. ~ 10. を繰り返して、地域クレーム East と Northwest を追加します。
East と Northwest のビヘイビアーに関するログをテストします。
ステップ 6.1: クレームをデコードする
次に、クレームをデコードします。
クレームをデコードするには
[サイトの操作] メニューの [サイトの設定] をクリックします。
[ユーザーと権限] セクションで、[ユーザーとグループ] をクリックします。
[ユーザーとグループ] ページで、salesmanager をクリックして、salesmanager (営業部長) クレームに関する情報を表示します (図 7 を参照)。
注意
salesmanager ロールを [ユーザーとグループ] ページにまだ追加していなければ、ここで追加します。salesmanager ロールを [ユーザーとグループ] ページに追加する方法については、ステップ 6: クレーム検索機能をテストする を参照してください。
図 7. salesmanager (営業部長) クレーム
アカウント名を調べ、付録 A: ID クレームのエンコード文字マップ のエンコード テーブルを使用して各文字をデコードします。
ステップ 7: クレーム解決機能をテストする
次に、クレーム解決機能をテストします。
クレーム解決機能をテストするには
ステップ 5: サイトからユーザーを削除する を繰り返して、サイトに追加したすべてのユーザー クレームを削除します。
http://intranet.contoso.com:200 に移動します。
資格情報 admin1/pass@word1 でログオンします。
[サイトの操作] メニューの [サイトの権限] をクリックします。
リボン上の [アクセス許可の付与] をクリックします。[アクセス許可の付与] ダイアログ ボックスが表示されます。[ユーザー/グループ] の下に [参照] アイコンがあります (図 8 を参照)。
図 8. [アクセス許可の付与] ダイアログ ボックスと [ユーザー選択ウィンドウ] アイコン
[ユーザー/グループ] テキスト ボックスに salesmanager と入力します。[ユーザー/グループ] テキスト ボックスの右下にある [名前の確認] アイコンをクリックして名前を解決します (図 9 を参照)。
図 9. salesmanager (営業部長) クレームの解決
[OK] をクリックして、salesmanager クレームを [FBA サイト メンバー] グループに追加します。
この手順の以上のステップを繰り返して、Bob、Mary、および Jack のビヘイビアーに関するログをテストします。
[ユーザー/グループ] テキスト ボックスで、sales と入力してワイルドカード検索を試します。複数の結果が返されます (図 10 を参照)。
注意
[参照] ダイアログ ボックスのときのようにクレーム プロバイダーを指定することはできません。[その他の名前] をクリックすると、[参照] ダイアログ ボックスが表示されます。
図 10. ワイルドカード検索
ステップ 8: クレーム プロバイダーをデバッグする
次に、以上のテストで得た知識に基づき、クレーム オーグメントと、検索および解決プロセスをデバッグします。
SharePoint セキュリティ トークン サービス (STS) のクレーム オーグメント プロセスをデバッグする場合は、w3wp.exe に接続する必要があります。
Web アプリケーションのクレーム検索またはクレーム解決をデバッグする場合は、w3wp.exe に接続してください。
クレーム プロバイダーに対して変更を行った場合は、iisreset を実行する必要があります。Microsoft Visual Studio 2010 では SharePoint STS プロセスがリサイクルされないからです。STS プロセスがまだ以前のバージョンのクレーム プロバイダーを参照している可能性があります。
ステップ 9: Windows アカウントのサポートを追加する
次に、http://intranet.contoso.com:200 に関して、Windows 認証とフォームベース認証の両方のサポートを有効にします。
Windows アカウントのサポートを追加するには
サーバーの全体管理 Web サイトを軌道します。
左側のナビゲーション ウィンドウで、[セキュリティ] をクリックします。
[一般的なセキュリティ] セクションの [認証プロバイダーの指定] をクリックします。
[Web アプリケーション] ドロップダウン リストで、http://intranet.contoso.com:200 を選択します。
[領域] の下の [既定] をクリックします (図 11 を参照)。
図 11. 認証プロバイダー ページ
[Windows 認証の有効化] チェック ボックスをオンにし、[統合 Windows 認証] をオンにします (図 12 を参照)。
図 12. クレーム認証の種類を選択する
[保存] をクリックします。
iisreset を実行します。
クレーム プロバイダーのソース コードに戻り、自分のドメイン アカウントが userDB 配列に追加されていることを確認します。
注意
この例では、contoso\administrator の SalesManager ロールを追加しました。
private static string[] userDB = { "bob:CRMRole:Reader", "bob:CRMRole:SalesRepresentative", "bob:CRMRegion:Northwest", "mary:CRMRole:Reader", "mary:CRMRole:SalesManager", "mary:CRMRegion:East", "jack:CRMRole:Reader", "jack:CRMRole:Executive", "jack:CRMRegion:East", "admin1:CRMRole:Administrator", "contoso\\andy:CRMRole:SalesManager", contoso\\administrator:CRMRole:SalesManager };
http://intranet.contoso.com:200 に移動します。
資格情報 admin1/pass@word1 でログオンします。
[サイトの操作] メニューの [サイトの権限] をクリックします。
サイトへのアクセス許可を SalesManager ロールに付与します (まだ付与していない場合)。
右上隅にあるドロップダウン リストで、[別のユーザーとしてサインイン] をクリックします。
[複数の認証の選択] ページが表示されます (図 13 を参照)。
図 13. [複数の認証の選択] ページ
ドロップダウン リストで、[Windows 認証] を選択します。これでサイトに自動的にログオンします。
注意
[Windows 認証] を選択すると、/_windows/default.aspx にリダイレクトされ、そこでサイレントな NTLM 認証が実行されます。その後、サイトに戻るようにリダイレクトされます。
クレーム ビューアー Web パーツを調べ、contoso\administrator にどのようなクレームが追加されたか確認します。
ステップ 10: クレーム スコープを変更する
このステップは、自分で行いましょう。具体的には、http://intranet.contoso.com/sites/CRMDocs の下にサイト コレクションを作成します。次に、サイトに次のものを追加します。
ドキュメント ライブラリ: CustomerDocs
カスタム リスト: East_Customers
このクレーム プロバイダーを、このサイトで使用できる唯一のクレーム プロバイダーにするものとします。
目標:
ユーザーが http://intranet.contoso.com にログオンする場合、そのユーザーのクレーム トークン内に CRM クレームが存在しないようにする。クレーム ビューアー Web パーツに CRM 関係のクレームを表示しない。
CRMRole=Reader のユーザーだけが http://intranet.contoso.com/sites/CRMDocs サイトにログオンできる。
CRMRole=Executive のユーザーは CustomerDocs ライブラリにアクセスできる。
CRMRegion=East のユーザーは East_Customers リストにアクセスできる。
これまでに学んだことに基づいて、この作業を行ってください。コードを実際に書いてみると、理解や記憶に役立ちます。
まとめ
このチュートリアルでは、フォームベース認証を使用する SharePoint 2010 Web アプリケーションのクレーム プロバイダーの作成方法と、作成したクレーム プロバイダーのテストの方法を学びました。
付録 A: ID クレームのエンコード文字マップ
表 1. クレームの種類のエンコード
文字 |
クレームの種類 |
---|---|
! |
SPClaimTypes.IdentityProvider |
" |
SPClaimTypes.UserIdentifier |
# |
SPClaimTypes.UserLogonName |
$ |
SPClaimTypes.DistributionListClaimType |
% |
SPClaimTypes.FarmId |
& |
SPClaimTypes.ProcessIdentitySID |
‘ |
SPClaimTypes.ProcessIdentityLogonName |
( |
SPClaimTypes.IsAuthenticated |
) |
Microsoft.IdentityModel.Claims.ClaimTypes.PrimarySid |
* |
Microsoft.IdentityModel.Claims.ClaimTypes.PrimaryGroupSid |
+ |
Microsoft.IdentityModel.Claims.ClaimTypes.GroupSid |
- |
Microsoft.IdentityModel.Claims.ClaimTypes.Role |
. |
System.IdentityModel.Claims.ClaimTypes.Anonymous |
/ |
System.IdentityModel.Claims.ClaimTypes.Authentication |
0 |
System.IdentityModel.Claims.ClaimTypes.AuthorizationDecision |
1 |
System.IdentityModel.Claims.ClaimTypes.Country |
2 |
System.IdentityModel.Claims.ClaimTypes.DateOfBirth |
3 |
System.IdentityModel.Claims.ClaimTypes.DenyOnlySid |
4 |
System.IdentityModel.Claims.ClaimTypes.Dns |
5 |
System.IdentityModel.Claims.ClaimTypes.Email |
6 |
System.IdentityModel.Claims.ClaimTypes.Gender |
7 |
System.IdentityModel.Claims.ClaimTypes.GivenName |
8 |
System.IdentityModel.Claims.ClaimTypes.Hash |
9 |
System.IdentityModel.Claims.ClaimTypes.HomePhone |
< |
System.IdentityModel.Claims.ClaimTypes.Locality |
= |
System.IdentityModel.Claims.ClaimTypes.MobilePhone |
> |
System.IdentityModel.Claims.ClaimTypes.Name |
? |
System.IdentityModel.Claims.ClaimTypes.NameIdentifier |
@ |
System.IdentityModel.Claims.ClaimTypes.OtherPhone |
[ |
System.IdentityModel.Claims.ClaimTypes.PostalCode |
\ |
System.IdentityModel.Claims.ClaimTypes.PPID |
] |
System.IdentityModel.Claims.ClaimTypes.Rsa |
^ |
System.IdentityModel.Claims.ClaimTypes.Sid |
_ |
System.IdentityModel.Claims.ClaimTypes.Spn |
` |
System.IdentityModel.Claims.ClaimTypes.StateOrProvince |
a |
System.IdentityModel.Claims.ClaimTypes.StreetAddress |
b |
System.IdentityModel.Claims.ClaimTypes.Surname |
c |
System.IdentityModel.Claims.ClaimTypes.System |
d |
System.IdentityModel.Claims.ClaimTypes.Thumbprint |
e |
System.IdentityModel.Claims.ClaimTypes.Upn |
f |
System.IdentityModel.Claims.ClaimTypes.Uri |
g |
System.IdentityModel.Claims.ClaimTypes.Webpage |
表 2. クレームの値の種類のエンコード
文字 |
クレームの種類 |
! |
Microsoft.IdentityModel.Claims.ClaimValueTypes.Base64Binary |
" |
Microsoft.IdentityModel.Claims.ClaimValueTypes.Boolean |
# |
Microsoft.IdentityModel.Claims.ClaimValueTypes.Date |
$ |
Microsoft.IdentityModel.Claims.ClaimValueTypes.Datetime |
% |
Microsoft.IdentityModel.Claims.ClaimValueTypes.DaytimeDuration |
& |
Microsoft.IdentityModel.Claims.ClaimValueTypes.Double |
‘ |
Microsoft.IdentityModel.Claims.ClaimValueTypes.DsaKeyValue |
( |
Microsoft.IdentityModel.Claims.ClaimValueTypes.HexBinary |
) |
Microsoft.IdentityModel.Claims.ClaimValueTypes.Integer |
* |
Microsoft.IdentityModel.Claims.ClaimValueTypes.KeyInfo |
+ |
Microsoft.IdentityModel.Claims.ClaimValueTypes.Rfc822Name |
- |
Microsoft.IdentityModel.Claims.ClaimValueTypes.RsaKeyValue |
. |
Microsoft.IdentityModel.Claims.ClaimValueTypes.String |
/ |
Microsoft.IdentityModel.Claims.ClaimValueTypes.Time |
0 |
Microsoft.IdentityModel.Claims.ClaimValueTypes.X500Name |
1 |
Microsoft.IdentityModel.Claims.ClaimValueTypes.YearMonthDuration |
その他の技術情報
詳細については、次のリソースを参照してください。