クレームに関するチュートリアル: SharePoint 2010 の信頼済みログイン プロバイダー用のクレーム プロバイダーを作成する
概要: 信頼済みログイン プロバイダー用のクレーム プロバイダーを作成する方法について学習します。信頼済みログイン プロバイダーは、SharePoint が信頼する外部 (つまり、SharePoint 外の) セキュリティ トークン サービス (STS) です。
最終更新日: 2013年1月18日
適用対象: Business Connectivity Services | Open XML | SharePoint Designer 2010 | SharePoint Foundation 2010 | SharePoint Online | SharePoint Server 2010 | Visual Studio
この記事の内容
信頼済みログイン プロバイダー用のクレーム プロバイダーの作成についての概要
手順 1: クレーム プロバイダー プロジェクトを作成する
手順 2: ユーザー情報を格納し、ユーザーのクレームのクエリに使用できる WingtipUserInfo クラスを作成する
手順 3: クレーム拡張コードを追加する
手順 4: クレーム検索コードを追加する
手順 5: クレーム解決コードを追加する
手順 6: WingtipClaimProvider を WingipSTS に登録する
手順 7: クレーム プロバイダーをテストする
まとめ
その他の技術情報
提供元: Andy Li、Microsoft Corporation
目次
信頼済みログイン プロバイダー用のクレーム プロバイダーの作成についての概要
手順 1: クレーム プロバイダー プロジェクトを作成する
手順 2: ユーザー情報を格納し、ユーザーのクレームのクエリに使用できる WingtipUserInfo クラスを作成する
手順 3: クレーム拡張コードを追加する
手順 4: クレーム検索コードを追加する
手順 5: クレーム解決コードを追加する
手順 6: WingtipClaimProvider を WingipSTS に登録する
手順 7: クレーム プロバイダーをテストする
まとめ
その他の技術情報
ダウンロード コード: Claims Example Trusted Login Provider (英語)
信頼済みログイン プロバイダー用のクレーム プロバイダーの作成についての概要
「クレームに関するチュートリアル: SharePoint 2010 における信頼済みログイン プロバイダー (SAML サインイン) の作成」では、信頼済みログイン プロバイダー用のクレーム プロバイダーを作成しませんでした。そこでは、Microsoft SharePoint 2010 で、信頼済みログイン プロバイダーからのクレームを解決、リスト、および検索する SPTrustedClaimProvider オブジェクトを生成するようにしていました。使用可能なクレームは、SPTrustedLoginProvider オブジェクト (idClaim.AddKnownClaimValue("user1@wingtip.com") など) を作成および登録するときにハードコードされています。
この例では、WingtipSTS 用のカスタム クレーム プロバイダーを作成します。このサンプルでは、メモリ内文字列配列にユーザーおよびクレーム情報を格納します。実際に実装する場合は、ディレクトリ サービスをクエリしてユーザー情報をデータベースに格納することを検討する必要があります。
注意
クレーム プロバイダーの詳細については、「クレーム プロバイダー」および「クレームに関するチュートリアル: SharePoint 2010 のクレーム プロバイダーを記述する」を参照してください。
既定では、SharePoint 2010 は、信頼済みログイン プロバイダーのユーザー選択ウィンドウで検索および解決を提供しません。したがって、ユーザーがユーザー選択ウィンドウで何かを入力しても、入力内容はそのまま返されます。これが原因で問題が発生することがあります。たとえば、あるユーザーのためにアクセスを追加したが、そのユーザーにまだアクセス権がない場合です。しかし、現時点で、検索および解決を可能にする標準規格やプロトコルは存在しません。また、そのような標準規格やプロトコルがあったとしても、状況によっては、その機能を使用できないこともあります。たとえば、Windows Live ID では、プライバシー上の理由により、検索を使用できないことがあります。
この問題はカスタム クレーム プロバイダーが解決します。カスタム クレーム プロバイダーは、検索および解決を可能にする特定のプロトコルを実装したり (そのようなプロトコルを使用できる場合)、ユーザーの入力内容に基本的な検証を実行してエラーを回避したりできます。たとえば、信頼済みログイン プロバイダーは、Contoso ユーザーに Fabrikam 社の Web サイトへのアクセスを付与するが、検索および解決に使用できるプロトコルやサービスを Contoso が用意していない場合は、カスタム クレーム プロバイダーを使用して、電子メール アドレスの後に常に "@contoso.com" があることなどを確認できます。
登録時、クレーム プロバイダーの名前と信頼済みログイン プロバイダーの名前は一致している必要があります。その理由は、信頼済みログイン プロバイダーからのクレームの issuer 値には、その信頼済みログイン プロバイダーの名前が使用されるからです。ユーザーの選択時に、カスタム クレーム プロバイダーに別の名前が使用されていると、ユーザー選択ウィンドウを介してそのクレーム プロバイダーによって追加されるクレームに別の "issuer" 値が使用されます。そのため、認証時に不一致となります。詳細については、「Replacing the Out of Box Name Resolution in SharePoint 2010—Part 2 (英語)」を参照してください。
信頼済みログイン プロバイダー用に割り当てるクレーム プロバイダーを変更することが重要です。この変更を行わないと、カスタム クレーム プロバイダーのほかに既定のクレーム プロバイダーも使用されて、混乱の原因となります。信頼済みログイン プロバイダー用に割り当てるクレーム プロバイダーの変更の詳細については、「How to Override the Default Name Resolution and Claims Provide in SharePoint 2010 (英語)」を参照してください。
この記事および手順の例では、信頼済みログイン プロバイダーの検索および解決について説明します。また、ここでは説明しませんが、カスタム クレーム プロバイダーを追加して拡張することもできます。1 つ目のクレーム プロバイダーは、このケースでの検索および解決に使用し、2 つ目のクレーム プロバイダーは、(CRM シナリオでの) クレーム拡張に使用するのが有効な構成です。
注意
信頼済みログイン プロバイダーは、SharePoint が信頼する外部 (つまり、SharePoint 外の) セキュリティ トークン サービス (STS) です。クレームに関する用語の定義については、「クレームベース ID の用語の定義」を参照してください。
SAML パッシブ サインインには、サインインのプロセスが記述されています。Web アプリケーションのサインインが、信頼済みログイン プロバイダーからトークンを受け取るように構成されている場合、この種類のサインインは SAML パッシブ サインインと呼ばれます。詳細については、「受信クレーム: SharePoint にサインインする」を参照してください。
手順 1: クレーム プロバイダー プロジェクトを作成する
この記事に付属する TrustedLogin ソリューションのダウンロード コードを開きます。図 1 に示すように、次の 3 つのプロジェクトが含まれています。
TestRPWeb Web サイト
WingtipSTS Web サイト
RegisterSTS WinForm アプリケーション
図 1. TrustedLogin に含まれる 3 つのプロジェクト
ソリューション エクスプローラーで、TrustedLogin ソリューションを右クリックし、[追加] をクリックして [新しいプロジェクト] をクリックします。
[Visual C#] の下で、[空の SharePoint プロジェクト] テンプレートを選択し、[SharePoint] を選択し、[2010] をクリックします。SharePoint プロジェクトに WingtipClaimProvider という名前を付けます。その後、次の操作を行います。
カスタマイズ ウィザードで [ファーム ソリューションとして配置する] を選択します。
デバッグ用サイトして、「https://intranet.contoso.com」を入力します。
WingtipClaimProvider プロジェクトに Microsoft.IdentityModel.dll の参照を追加します。
Microsoft.IdentityModel.dll の詳細については、「Windows Identity Foundation」を参照してください。
WingtipClaimProvider プロジェクトを右クリックし、[追加] を選択して、[新しいアイテム] をクリックします。
プロジェクトに新しいクラス ファイルを WingtipClaimTypes.cs という名前で追加します。
WingtipClaimTypes.cs ファイルは、このクレーム プロバイダーでサポートするクレームの種類を定義します。WingtipClaimTypes.cs ファイル内のコードを次のコードで置き換えます。クレームの種類を 1 つ追加していることに注意してください。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WingtipClaimProvider { public class WingtipClaimType { public static string EmailAddress = "https://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"; public static string Title = "http://schemas.wingtip.com/sharepoint/2009/08/claims/title"; public static string Department = "http://schemas.wingtip.com/sharepoint/2009/08/claims/department"; } }
手順 2: ユーザー情報を格納し、ユーザーのクレームのクエリに使用できる WingtipUserInfo クラスを作成する
図 2 に示すように、このプロジェクトに WingtipUserInfo.cs という名前の新しいクラス ファイルを追加します。
図 2. 新しいクラス ファイルを WingtipClaimProvider プロジェクトに追加する
using 文を次のコードで置き換えます。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.SharePoint.Administration; using Microsoft.IdentityModel.Claims; using System.Collections;
次の文字列配列を WingtipUserInfo クラスに追加します。これらの 2 つの文字列配列にはユーザー情報が格納されます。
userDB 文字列配列には、ユーザー情報と、関連するクレームが格納されます (電子メール アドレスはユーザーの識別子として使用されます)。
claimsDB 文字列配列には、このクレーム プロバイダーで検索できる使用可能なクレームが格納されます。
private static string[] userDB = { "user1@wingtip.com:Email:user1@wingtip.com", "user2@wingtip.com:Email:user1@wingtip.com", "user3@wingtip.com:Email:user1@wingtip.com", "user1@wingtip.com:Title:Engineer", "user2@wingtip.com:Title:Manager", "user3@wingtip.com:Title:CEO", "user1@wingtip.com:Department:Finance", "user2@wingtip.com:Department:IT", "user3@wingtip.com:Department:AP", }; private static string[] claimsDB = { "Email:user1@wingtip.com", "Email:user2@wingtip.com", "Email:user3@wingtip.com", "Title:Employoee", "Title:Manager", "Title:NorthWest", "Department:Finance", "Department:IT", "Department:AP" };
次のコードを WingtipUserInfo クラスに追加します。これらの関数は、userDB および claimsDB から情報を読み取って解析するユーティリティ関数で、クレームの解決、検索、およびリストに使用されます。
/// <summary> /// A real-world implementation should look up a directory service /// or database to retrieve a user claim. /// The following code is used only for demonstration purposes. /// </summary> /// <param name="username"></param> /// <returns></returns> 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; } // Manually construct a list of users. // In a real-world production environment, // you should look up from a directory service or database to // retrieve the user information. public static List<string> GetAllUsers() { List<string> allUsers = new List<string>(); // Adding forms-based users. allUsers.Add("user1@wingtip.com"); allUsers.Add("user2@wingtip.com"); allUsers.Add("user3@wingtip.com"); // Adding Windows domain users, if you want this provider to // support Windows claims mode. return allUsers; } /// <summary> /// This function returns all the known claims from the CRM system /// so that the claims provider is able to /// search and resolve the claims in the 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("Email", StringComparison.OrdinalIgnoreCase)) return WingtipClaimType.EmailAddress; else if (roleName.Equals("Title", StringComparison.OrdinalIgnoreCase)) return WingtipClaimType.Title; else if (roleName.Equals("Department", StringComparison.OrdinalIgnoreCase)) return WingtipClaimType.Department; else throw new Exception("Claim Type not found!"); }
手順 3: クレーム拡張コードを追加する
ClaimProvider.cs という名前の新しいクラス ファイルを追加します。
using 文を次のコードで置き換えます。
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.SharePoint.Administration.Claims; using Microsoft.SharePoint.Administration.Claims; using Microsoft.SharePoint.WebControls; using Microsoft.IdentityModel.Claims;
クラス継承を次のコードと一致するように変更します。
class ClaimProvider: SPClaimProvider
コンストラクターと 2 つのプロパティを追加します。
public ClaimProvider(string displayName) : base(displayName) { } public override string Name { get { return "WingtipClaimProvider"; } } // The AssociatedTrustedLoginProviderName property is used for // generating the SPClaim object. public string AssociatedTrustedLoginProviderName { get { return "WingtipSTS"; } }
クレームの拡張、検索、および解決のサポートを追加します。
/// <summary> /// Must return true if you are doing claims augmentation. /// </summary> public override bool SupportsEntityInformation { get { return true; } } /// <summary> /// Return true if you support claims resolve 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; } }
次の関数を追加して、Claim Types 情報を提供します。
FillEntityTypes では、User と FormRoles の両方をサポートしていることに注意してください。サポートしているクレームの種類ごとにエンティティの種類を返す必要があります。このケースでは、EmailAddress は ID クレーム (SPClaimEntityTypes.User) として処理され、他の 2 つのクレームの種類は役割 (SPClaimEntityTypes.FormRole) として処理されます。
/// <summary> /// Returns all the claims types that are supported by this 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(WingtipClaimType.EmailAddress); claimTypes.Add(WingtipClaimType.Title); claimTypes.Add(WingtipClaimType.Department); } /// <summary> /// Return all claim value types that correspond to the claim types. /// You must return the values in the same order as /// in FillClaimTypes(). /// </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); claimValueTypes.Add (Microsoft.IdentityModel.Claims.ClaimValueTypes.String); } /// <summary> /// Required for the People Picker. /// 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.User); entityTypes.Add(SPClaimEntityTypes.FormsRole); entityTypes.Add(SPClaimEntityTypes.FormsRole); }
次のユーティリティ関数を追加します。この関数は、クレーム オブジェクトの生成に使用します。
注意
ここでは、クレームの発行者は (WingtipClaimProvider ではなく) WingtipSTS であることを明示的に指定しています。
// The claim from this provider should have WingtipSTS as the // provider name. private SPClaim CreateClaimForSTS(string claimtype, string claimValue) { SPClaim result = new SPClaim(claimtype, claimValue, Microsoft.IdentityModel.Claims.ClaimValueTypes.String, SPOriginalIssuers.Format (SPOriginalIssuerType.TrustedProvider, AssociatedTrustedLoginProviderName)); return result; }
FillClaimsForEntity 関数を追加して、クレーム拡張をサポートします。
/// <summary> /// Implement this method if the 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"); } //Adding the role claim. SPClaim userIdClaim = SPClaimProviderManager.DecodeUserIdentifierClaim(entity); //Adding claims for users. List<string> allWingtipUsers = WingtipUserInfo.GetAllUsers(); if (allWingtipUsers.Contains(userIdClaim.Value.ToLower())) { List<Claim> userClaims = WingtipUserInfo.GetClaimsForUser (userIdClaim.Value.ToLower()); foreach (Claim claim in userClaims) { claims.Add(CreateClaimForSTS(claim.ClaimType, claim.Value)); } } }
手順 4: クレーム検索コードを追加する
FillSearch メソッドを追加して、クレームの検索をサポートします。
関数の強調されている部分を見てください。ユーザーが電子メール アドレスを検索した場合は ID クレームを、それ以外の場合は役割のクレームを返すようになっています。
注意
このケースでは、LINQ クエリを使用して、ワイルドカード検索をサポートしています。
/// <summary> /// Required if you implement the claims search for 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 = WingtipUserInfo.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 for "SalesManager", //the ClaimType will be CRMClaimType.Role. string claimType = WingtipUserInfo.GetClaimTypeForRole((string) knownClaims[claimValue]); PickerEntity entity = CreatePickerEntity(); entity.Claim = CreateClaimForSTS(claimType, claimValue); entity.Description = claimValue; entity.DisplayText = claimValue; entity.EntityData[PeopleEditorEntityDataKeys.DisplayName] = claimValue; if (string.Compare(claimType, WingtipClaimType.EmailAddress, true) == 0) { entity.EntityType = SPClaimEntityTypes.User; } else { entity.EntityType = SPClaimEntityTypes.FormsRole; } entity.IsResolved = true; searchTree.AddEntity(entity); } }
手順 5: クレーム解決コードを追加する
2 つの FillResolve メソッドを追加して、クレームの解決をサポートします。
このコードは、キーワードと ClaimsDB の値を照合して、適切なデータを返します。
/// <summary> /// Resolve one single claim by using exact match. /// This method is required for both claims search /// and claims 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 = WingtipUserInfo.GetAllClaims(); if (knownClaims.ContainsKey(keyword)) { // Get the claim type. // For example, if you search for "SalesManager", the ClaimType // will be CRMClaimType.Role. // In this case, the keyword is the value of the claim. string claimValue = keyword; string claimType = WingtipUserInfo.GetClaimTypeForRole((string)knownClaims[keyword]); PickerEntity entity = CreatePickerEntity(); entity.Claim = CreateClaimForSTS(claimType, claimValue); entity.Description = claimValue; entity.DisplayText = claimValue; entity.EntityData[PeopleEditorEntityDataKeys.DisplayName] = claimValue; if (string.Compare(claimType, WingtipClaimType.EmailAddress, true) == 0) { entity.EntityType = SPClaimEntityTypes.User; } else { entity.EntityType = SPClaimEntityTypes.FormsRole; } entity.IsResolved = true; resolved.Add(entity); } } /// <summary> /// Required if you implement claims resolve for 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 = WingtipUserInfo.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 claim type. // For example, if you search for "SalesManager", // the ClaimType will be CRMClaimType.Role. string claimType = WingtipUserInfo.GetClaimTypeForRole((string) knownClaims[claimValue]); PickerEntity entity = CreatePickerEntity(); entity.Claim = CreateClaimForSTS(claimType, claimValue); entity.Description = claimValue; entity.DisplayText = claimValue; entity.EntityData[PeopleEditorEntityDataKeys.DisplayName] = claimValue; if (string.Compare(claimType, WingtipClaimType.EmailAddress, true) == 0) { entity.EntityType = SPClaimEntityTypes.User; } else { entity.EntityType = SPClaimEntityTypes.FormsRole; } entity.IsResolved = true; resolved.Add(entity); } }
次の FillHierarchy メソッドを追加して、階層をサポートしないことを示します。
protected override void FillHierarchy(Uri context, string[] entityTypes, string hierarchyNodeID, int numberOfLevels, SPProviderHierarchyTree hierarchy) { throw new NotImplementedException(); }
プロジェクトをコンパイルし、エラーがあればすべて修正します。
手順 6: WingtipClaimProvider を WingipSTS に登録する
登録時、クレーム プロバイダーの名前と信頼済みログイン プロバイダーの名前は一致している必要があります。その理由は、信頼済みログイン プロバイダーからのクレームの issuer 値には、その信頼済みログイン プロバイダーの名前が使用されるからです。ユーザーの選択時に、カスタム クレーム プロバイダーに別の名前が使用されていると、ユーザー選択ウィンドウを介してそのクレーム プロバイダーによって追加されるクレームに別の issuer 値が使用されます。そのため、認証時に不一致となります。詳細については、「Replacing the Out of Box Name Resolution in SharePoint 2010—Part 2 (英語)」を参照してください。
ソリューション エクスプローラーで、[フィーチャー] ノードを右クリックし、[フィーチャーの追加] をクリックします。
フィーチャーの [範囲] を Farm に変更します。
[Feature1] を右クリックし、[イベント レシーバーの追加] をクリックします。
using 文を次のコードで置き換えます。
using System; using System.Runtime.InteropServices; using System.Security.Permissions; using Microsoft.SharePoint; using Microsoft.SharePoint.Security; using Microsoft.SharePoint.Administration.Claims;
クラス継承を次のコードと一致するように変更します。
public class Feature1EventReceiver :SPClaimProviderFeatureReceiver
次のコードをクラスに追加します。他のコードはコメントのままにしておきます。
private string providerDisplayName = "Wingtip Claim Provider"; private string providerDescription = "Provides Claims from Wingtip"; public override string ClaimProviderAssembly { get { return typeof (WingtipClaimProvider.ClaimProvider).Assembly.FullName; } } public override string ClaimProviderDisplayName { get { return providerDisplayName; } } public override string ClaimProviderType { get { return typeof(WingtipClaimProvider.ClaimProvider).FullName; } } public override string ClaimProviderDescription { get { return providerDescription; } } public override bool ClaimProviderUsedByDefault { get { return true; } }
WingtipClaimProvider プロジェクトをコンパイルして、正常にビルドされたことを確認します。
WingtipClaimProvider プロジェクトを右クリックし、[展開] をクリックします。この手順を実行すると、クレーム プロバイダーがファームに登録されます。
RegisterSTS プロジェクトの Form1 を開きます。
Update ClaimProvider という名前のボタンを追加します。
図 3 に示すように、フォームにはボタンが 2 つだけあります。1 つは WingtipSTS を登録するボタン、もう 1 つは Update ClaimProvider です。
図 3. Form1 に [Update ClaimProvider] ボタンが表示されている
新しいボタンのコードビハインドに、次のコードを追加します。
SPSecurityTokenServiceManager manager = SPSecurityTokenServiceManager.Local; string providerName = "WingtipSTS"; SPTrustedLoginProvider provider = manager.TrustedLoginProviders[providerName]; provider.ClaimProviderName = "WingtipClaimProvider"; provider.Update(); }
アプリケーションをコンパイルし、エラーがあればすべて修正します。
RegisterSTS プロジェクトを右クリックし、[デバッグ] を選択して、[新しいインスタンスを開始] を選択します。
アプリケーションが起動したら、[Update ClaimProvider] ボタンをクリックします。これにより、信頼済みログイン プロバイダー WingtipSTS 用のクレーム プロバイダーが更新されます。
手順 7: クレーム プロバイダーをテストする
再度、WingtipSTS プロジェクトが実行されていて、ブラウザーからアクセスできることを確認します。
サーバーの全体管理 Web サイトを起動します。
[サイト コレクションの作成] ページ (図 4 を参照) で、https://intranet.contoso.com を選択します。
図 4. [サイト コレクションの作成] ページ
[サイト コレクションの管理者] セクションで、[参照] アイコンをクリックして、ユーザー選択ウィンドウを起動します。図 5 に示すように、左側に "Wingtip クレーム プロバイダー" があることを確認します。これは、作成したばかりのクレーム プロバイダーです。
図 5. ユーザー選択ウィンドウに表示された Wingtip クレーム プロバイダー
左側のウィンドウで、Wingtip クレーム プロバイダーを選択します。[検索] ボックスに「user」と入力します。図 6 に示すように、3 名のユーザーが返されます。
図 6. ユーザー選択ウィンドウに "user" の検索結果として 3 名のユーザーが返される
User1@wingtip.com をサイト コレクションの管理者として選択します。
サイト コレクションを https://intranet.contoso.com/sites/Test1 に作成します。
サイト コレクションが作成されたら、ブラウザーで https://intranet.contoso.com/sites/Test1 にナビゲートします。
図 7 に示すように、WingtipSTS ログオン ページで user1@wingtip.com の資格情報を入力します (パスワードは任意の文字列を入力します)。
注意
WingtipSTS が実行されていることを確認します。実行されていない場合は、WingtipSTS プロジェクトを右クリックし、[ブラウザーで表示] を選択します。
図 7. WingtipSTS ログオン ページ
[送信] をクリックします。SharePoint サイトにリダイレクトされます (最初の起動にはしばらく時間がかかることがあります)。
図 8. 正常にログオンした後、SharePoint サイトにリダイレクトされる
[サイトの操作] メニューの [サイトの権限] を選択します。
リボンで、[アクセス許可の付与] をクリックします。
「IT」と入力し、Enter キーを押します。名前が解決されたら、IT をクリックし、it [Wingtip Claim Provider] を選択します。
図 9. "it [Wingtip Claim Provider]" を選択する
[参照] アイコンをクリックして、[ユーザー選択ウィンドウ] ダイアログ ボックスを開きます。
AP を検索します。図 10 に示すように、Wingtip クレーム プロバイダーから返されたエントリを選択します。
図 10. Wingtip クレーム プロバイダーから "AP" を選択する
図 11 に示すように、IT と AP を Members グループ (共同作成者) に追加します。
図 11. "IT" と "AP" を Members グループ (共同作成者) に追加する
図 12 に示すように、user1@wingtip.com からサインアウトし、ブラウザーのインスタンスをすべて閉じます。
注意
この手順は重要です。ブラウザーのインスタンスをすべて必ず閉じてください。
図 12. サインアウト
Internet Explorer または別のブラウザーの新しいインスタンスを開き、https://intranet.contoso.com/sites/Test1 に移動します。
user2@wingtip.com を使用してログオンを試みます。
ログオンできますか、できませんか? その理由は何ですか?
user3@wingtip.com を使用してログオンを試みます。
ログオンできますか、できませんか? その理由は何ですか?
クレーム ビューアー Web パーツを作成して、ホーム ページに追加したら、3 名のユーザー全員のクレームを表示します (この手順を実行するコードは含まれません)。
まとめ
このチュートリアルでは、信頼済みログイン プロバイダー用のクレーム プロバイダーを作成する方法について学習しました。信頼済みログイン プロバイダーは、SharePoint が信頼する外部 STS です。
その他の技術情報
詳細については、次のリソースを参照してください。
クレーム チュートリアル: SharePoint 2010 のフォームベース認証 Web アプリケーションのクレーム プロバイダーを作成する
クレームに関するチュートリアル: カスタムのメンバーシップとロール プロバイダーを使用してクレーム ベースの SharePoint 2010 Web アプリケーション用のフォーム ベース認証を作成する
クレームに関するチュートリアル: SharePoint 2010 における信頼済みログイン プロバイダー (SAML サインイン) の作成
Replacing the Out of Box Name Resolution in SharePoint 2010—Part 2 (英語)
How to Override the Default Name Resolution and Claims Provide in SharePoint 2010 (英語)