Partager via


Procédure pas à pas pour les revendications : création de fournisseurs de revendications pour les applications Web utilisant l’authentification par formulaire pour SharePoint 2010

Résumé : découvrez comment créer un fournisseur de revendications pour une application Web utilisant l’authentification par formulaire Microsoft SharePoint 2010.

Dernière modification : lundi 9 mars 2015

S’applique à : Business Connectivity Services | Open XML | SharePoint Designer 2010 | SharePoint Foundation 2010 | SharePoint Online | SharePoint Server 2010 | Visual Studio

Dans cet article
Vue d’ensemble de la création d’un fournisseur de revendications pour une application Web utilisant l’authentification par formulaire
Scénario : utilisation de revendications pour accéder à des ressources SharePoint
Conclusion
Annexe A : table des caractères de codage des revendications d’identité
Ressources supplémentaires

Auteur :  Andy Li, Microsoft Corporation

Contenu

  • Vue d’ensemble de la création d’un fournisseur de revendications pour une application Web utilisant l’authentification par formulaire

  • Scénario : utilisation de revendications pour accéder à des ressources SharePoint

  • Conclusion

  • Annexe A : table des caractères de codage des revendications d’identité

  • Ressources supplémentaires

Cliquez pour obtenir le code Code à télécharger : ClaimsExample-ContosoClaimsProviders(éventuellement en anglais)

Vue d’ensemble de la création d’un fournisseur de revendications pour une application Web utilisant l’authentification par formulaire

Dans cette procédure pas à pas, vous implémentez un exemple de fournisseur de revendications de gestion de la relation client (GRC) pour l’application Web basée sur des formulaires que vous avez créée dans Procédure pas à pas sur les revendications : création de l’authentification par formulaire pour les applications Web SharePoint 2010 basées sur des revendications à l’aide de fournisseurs d’appartenances et de rôles personnalisés. Ensuite, vous modifiez le fournisseur de revendications pour fournir des revendications GRC supplémentaires (à l’aide d’une augmentation des revendications) qui permettent de contrôler l’accès aux ressources SharePoint à l’aide d’une liste de contrôle d’accès.

Par défaut, l’exploration et la résolution des revendications fonctionnent avec des fournisseurs d’appartenances et de rôles qui implémentent les interfaces que Microsoft SharePoint Foundation 2010 et Microsoft SharePoint Server 2010 appellent à partir du fournisseur de revendications par défaut pour l’authentification par formulaire. Il peut arriver que des revendications supplémentaires soient requises (par exemple, pour la GRC comme indiqué dans la section consacrée au scénario). Dans ces cas, vous pouvez utiliser un fournisseur de revendications d’augmentation.

Le terme augmentation des revendications s’applique à tout type d’authentification par revendications : authentification par revendications Windows, connexion SAML (Security Assertion Markup Language) et authentification par formulaire.

Notes

Pour plus d’informations sur l’augmentation des revendications, voir Procédure pas à pas pour les revendications : écriture de fournisseurs de revendications pour SharePoint 2010.

Scénario : utilisation de revendications pour accéder à des ressources SharePoint

Supposons que vous disposez d’un système GRC externe qui possède un ensemble de paramètres de compte complètement différent. Lors de l’ouverture d’une session sur le système CRM, un utilisateur fournit un jeu spécifique de nom d’utilisateur et de mot de passe. Après l’ouverture de session, le système CRM accorde à chaque utilisateur différentes autorisations basées sur son paramètre de compte.

Par exemple, chaque compte CRM possède deux attributs : Role et Region. L’attribut Role indique si l’utilisateur actuel est un représentant commercial, un directeur commercial ou un cadre. L’attribut Region indique où se trouve l’utilisateur.

Dans Microsoft SharePoint 2010, il existe une collection de sites dédiée au stockage des documents liés à la GRC. L’idée est de pouvoir récupérer à partir du système GRC les informations de rôle et de région d’un utilisateur lorsque celui-ci se connecte au site SharePoint afin d’appliquer aux documents des autorisations basées sur ces informations.

Étape 1 : préparation du projet

Tout d’abord, vous préparez le projet SharePoint.

Pour préparer le projet

  1. Créez un projet SharePoint vide.

  2. Nommez le projet ContosoClaimProviders.

  3. Lorsque vous êtes invité à indiquer le site SharePoint pour le débogage, tapez http://intranet.contoso.com:200. C’est à cet emplacement que les revendications d’authentification par formulaire sont activées.

  4. Ajoutez une référence à l’assembly Microsoft.IdentityModel.dll.

Étape 2 : ajout de la fonction de recherche d’utilisateur

Ensuite, vous ajoutez une fonction qui permet de rechercher les informations utilisateur.

Pour ajouter la fonction de recherche d’utilisateur

  1. Ajoutez au projet un fichier de classe nommé CRMClaimTypes.cs.

  2. Ajoutez les espaces de noms suivants.

    using Microsoft.SharePoint.Administration;
    using Microsoft.IdentityModel.Claims;
    using System.Collections;
    
  3. Remplacez le code dans le fichier CRMClaimTypes.cs par le code suivant. La classe CRMClaimType définit les deux revendications personnalisées prises en charge par notre fournisseur de revendications.

    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";
        }
    }
    
  4. Ajoutez un fichier de classe nommé CRMUserInfo.cs. La classe CRMUseInfo permet de prendre en charge la recherche des informations utilisateur. Le code suivant est fourni uniquement à des fins de démonstration. Une implémentation dans un environnement de production doit prévoir le stockage des informations utilisateur dans un lieu sûr ou la recherche des données à partir de la base de données ou des services d’annuaire.

    1. Ajoutez le code suivant à la classe 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",
                  };
      
    2. Ajoutez une méthode statique nommée GetClaimsForUser. Il s’agit d’une méthode utilitaire qui retourne toutes les revendications pour un utilisateur spécifique.

              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;
              }
      
    3. Ajoutez une méthode statique nommée GetAllUsers. Il s’agit d’une autre méthode utilitaire qui retourne tous les noms de comptes d’un utilisateur.

              // 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;
              }
      
    4. Ajoutez les deux méthodes suivantes à la classe CRMUserInfo.

      La méthode GetAllClaims retourne toutes les valeurs de revendications connues prises en charge par ce fournisseur. Toutes les valeurs sont définies dans le tableau de chaînes claimsDB.

      La méthode utilitaire GetClaimTypeForRole convertit un type de revendication à partir de son nom de chaîne dans le type de revendication réel. Par exemple, CRMRole devient 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!");
              }
      

Étape 3 : création du fournisseur de revendications

Ensuite, vous implémentez un fournisseur de revendications.

Pour implémenter le fournisseur de revendications

  1. Ajoutez un fichier de classe nommé CRMClaimProvider.cs.

  2. Ajoutez les espaces de noms suivants.

    using Microsoft.SharePoint.Administration.Claims;
    using Microsoft.IdentityModel.Claims;
    using System.Collections;
    using Microsoft.SharePoint.WebControls;
    
  3. Définissez l’héritage de la classe CRMClaimProvider sur la classe SPClaimProvider.

    public class CRMClaimProvider : SPClaimProvider
    
  4. Ajoutez le code suivant pour prendre en charge la construction de la propriété Name.

            public CRMClaimProvider(string displayName)
                : base(displayName)
            {
            }
    
            public override string Name
            {
                get { return "ContosoCRMClaimProvider"; }
            }
    
  5. Ajoutez le code suivant à la classe. Comme le suggèrent les noms des propriétés, celles-ci retournent true ou false pour prendre en charge chaque méthode spécifique.

           /// <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;
                }
            }
    
  6. Ajoutez les méthodes suivantes à la classe :

    • FillClaimTypes   Appelée par SharePoint 2010 pour récupérer les types de revendications pris en charge par le fournisseur de revendications.

    • FillClaimValueTypes   Appelée par SharePoint 2010 pour récupérer les types de valeur de revendication correspondants pour chaque type de revendication qu’elle prend en charge.

    • FillSchema   Appelée par le sélecteur de personnes pour obtenir les informations pouvant être affichées dans celui-ci.

    • FillEntityTypes   Indique au sélecteur de personnes les types de revendications que le fournisseur de revendications prend en charge (c’est-à-dire, utilisateur ou rôle).

            /// <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);
            }
    
  7. Ajoutez la méthode FillClaimsForEntity pour prendre en charge l’augmentation des revendications. Cette méthode est appelée par le service d’émission de jeton de sécurité SharePoint une fois que l’utilisateur a été authentifié.

          /// <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));
                    }
    
                }
    
            }
    
  8. Ajoutez la méthode FillSearch pour prendre en charge l’exploration des revendications.

           /// <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);
                }
    
            }
    
  9. Ajoutez les deux méthodes FillResolve suivantes pour prendre en charge la résolution des revendications dans le sélecteur de personnes.

            /// <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);
                }
    
            }
    
  10. Ajoutez la méthode FillHierarchy suivante. Cette méthode est requise pour l’implémentation de toutes les fonctions pour une classe abstraite.

            protected override void FillHierarchy(Uri context, string[] entityTypes, string hierarchyNodeID, int numberOfLevels, SPProviderHierarchyTree hierarchy)
            {
                throw new NotImplementedException();
            }
    
  11. Générez le projet et corrigez les erreurs éventuelles.

Étape 4 : déploiement d’un fournisseur de revendications

Ensuite, vous déployez le fournisseur de revendications.

Pour déployer le fournisseur de revendications

  1. Dans l’Explorateur de solutions, ajoutez une fonctionnalité sous le nœud Features. Attribuez-lui le nom CRMClaimProvider.

  2. Cliquez avec le bouton droit sur CRMClaimProvider, puis cliquez sur Ajouter un récepteur d’événements.

  3. Définissez l’étendue de la fonctionnalité sur la batterie de serveurs.

  4. Ajoutez l’espace de noms au fichier de la classe du récepteur.

    using Microsoft.SharePoint.Administration.Claims;
    
  5. Dérivez la classe de SPClaimProviderFeatureReceiver. Ce récepteur de base fournit la fonction qui permet d’inscrire la revendication auprès de la batterie de serveurs.

    public class CRMClaimProviderEventReceiver : SPClaimProviderFeatureReceiver
    
  6. Remplacez l’implémentation du récepteur par le code suivant.

           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;
                }
            }
    
  7. Générez le projet et déployez-le sur la batterie de serveurs.

Étape 5 : suppression d’utilisateurs du site

Ensuite, vous supprimez des utilisateurs.

Pour supprimer des utilisateurs d’un site

  1. Accédez à http://intranet.contoso.com:200.

  2. Ouvrez une session à l’aide des informations d’identification admin1/pass@word1.

  3. Dans le menu Actions du site, cliquez sur Paramètres du site.

  4. Dans la section Utilisateurs et autorisations, cliquez sur Personnes et groupes.

  5. Dans le volet de navigation de gauche, cliquez sur Plus.

  6. Supprimez bob, mary et jack, si ces éléments sont présents.

  7. Supprimez Employee, TeamManager et CEO, si ces éléments sont présents.

  8. Dans la liste déroulante située dans le coin supérieur droit, cliquez sur Se connecter en tant qu’utilisateur différent.

  9. Essayez d’ouvrir une session en tant que Bob, Mary ou Jack. Vous devez obtenir un message d’erreur, comme le montre la figure 1.

    Figure 1. Message d’erreur d’accès refusé

    Message d’erreur d’accès refusé

    Notes

    Si vous n’obtenez pas un message d’erreur d’accès refusé, revenez aux étapes précédentes et vérifiez que vous avez supprimé la totalité des utilisateurs et des rôles que vous avez ajoutés à l’Étape 2 : ajout de la fonction de recherche d’utilisateur.

Étape 6 : test de la fonctionnalité d’exploration des revendications

Ensuite, vous devez tester la fonctionnalité d’exploration des revendications.

Pour tester la fonctionnalité d’exploration des revendications

  1. Accédez à http://intranet.contoso.com:200.

  2. Ouvrez une session à l’aide des informations d’identification admin1/pass@word1.

  3. Dans le menu Actions du site, cliquez sur Autorisations de site.

  4. Dans le Ruban, cliquez sur Accorder des autorisations. La boîte de dialogue Accorder des autorisations apparaît, avec l’icône Parcourir sous Utilisateurs/Groupes, comme l’illustre la figure 2.

    Figure 2. Boîte de dialogue Accorder des autorisations avec l’icône du sélecteur de personnes

    Boîte de dialogue Accorder des autorisations

  5. Cliquez sur l’icône Parcourir pour lancer la boîte de dialogue Sélecteur de personnes, illustrée par la figure 3.

    Figure 3. Boîte de dialogue Sélecteur de personnes

    Sélecteur de personnes

  6. Tapez sales dans la zone de recherche, puis cliquez sur Rechercher. Deux résultats doivent apparaître, comme le montre la figure 4.

    Figure 4. Recherche de revendications liées aux ventes

    Recherche de revendications liées aux ventes

  7. Double-cliquez sur chacun des résultats pour les ajouter au champ Ajouter.

  8. Cliquez sur OK pour fermer le sélecteur de personnes. Les rôles salesmanager et salesrepresentative doivent avoir été ajoutés au champ Utilisateurs/Groupes, comme le montre la figure 5.

  9. Sous Accorder des autorisations, sélectionnez FBA Site Members [Contribute].

    Figure 5. Sélection de membres du site avec authentification par formulaire (collaborateur)

    Sélection de membres du site avec authentification par formulaire

  10. Cliquez sur OK.

  11. Dans le volet de navigation de gauche, cliquez sur FBA Site Members. Les rôles salesmanager et salesrepresentative (revendications) ont normalement été ajoutés au groupe FBA Site Members, comme le montre la figure 6.

    Figure 6. Rôles salesmanager et salesrepresentative dans le groupe des membres du site avec authentification par formulaire

    Rôles de directeur commercial et de représentant commercial

  12. Dans la liste déroulante située dans le coin supérieur droit, cliquez sur Se connecter en tant qu’utilisateur différent.

  13. Essayez d’ouvrir une session en tant que Bob ou Mary.

  14. Ensuite, essayez d’ouvrir une session en tant que Jack. Y êtes-vous parvenu ? Quelle est la raison de l’échec éventuel de l’ouverture de session ?

  15. À présent, ouvrez une session en utilisant les informations d’identification admin1/pass@word1.

  16. Répétez les étapes 3 à 10 de cette procédure pour ajouter le rôle Executive.

  17. Essayez d’ouvrir une session à l’aide des informations d’identification de Jack et déterminez si l’opération est cette fois couronnée de succès.

  18. Répétez les étapes 3 à 10 de cette procédure pour ajouter les revendications de région East et Northwest.

  19. Testez le comportement d’ouverture de session pour East et Northwest.

Étape 6.1 : décodage des revendications

Ensuite, décodez les revendications.

Pour décoder les revendications

  1. Dans le menu Actions du site, cliquez sur Paramètres du site.

  2. Dans la section Utilisateurs et autorisations, cliquez sur Personnes et groupes.

  3. Dans la page Personnes et groupes, cliquez sur salesmanager pour afficher les informations relatives à la revendication salesmanager, comme le montre la figure 7.

    Notes

    Si vous n’avez pas encore ajouté le rôle salesmanager à la page Personnes et groupes, ajoutez-le maintenant. Pour plus d’informations sur la façon d’ajouter le rôle salesmanager à la page Personnes et groupes, voir l’Étape 6 : test de la fonctionnalité d’exploration des revendications.

    Figure 7. Revendication liée au directeur commercial

    Revendication liée au directeur commercial

  4. Observez le nom associé au champ Compte et utilisez la table de codage à l’Annexe A : table des caractères de codage des revendications d’identité pour déchiffrer chaque caractère.

Étape 7 : test de la fonctionnalité de résolution des revendications

Ensuite, testez la fonctionnalité de résolution des revendications.

Pour tester la fonctionnalité de résolution des revendications

  1. Répétez l’Étape 5 : suppression d’utilisateurs du site pour supprimer toutes les revendications des utilisateurs que vous avez ajoutées au site.

  2. Accédez à http://intranet.contoso.com:200.

  3. Ouvrez une session à l’aide des informations d’identification admin1/pass@word1.

  4. Dans le menu Actions du site, cliquez sur Autorisations de site.

  5. Dans le Ruban, cliquez sur Accorder des autorisations. La boîte de dialogue Accorder des autorisations avec l’icône Parcourir sous Utilisateurs/Groupes apparaît, comme l’illustre la figure 8.

    Figure 8. Boîte de dialogue Accorder des autorisations avec l’icône du sélecteur de personnes

    Boîte de dialogue Accorder des autorisations

  6. Tapez salesmanager dans la zone de texte Utilisateurs/Groupes. Cliquez sur l’icône Vérifier les noms située en bas à droite de la zone de texte Utilisateurs/Groupes pour résoudre le nom, comme l’illustre la figure 9.

    Figure 9. Résolution de la revendication liée au directeur commercial

    Résolution de la revendication liée au directeur commercial

  7. Cliquez sur OK pour ajouter la revendication salesmanager au groupe FBA Site Members.

  8. Répétez les étapes précédentes de cette procédure pour tester le comportement d’ouverture de session pour Bob, Mary et Jack.

  9. Dans la zone de texte Utilisateurs/Groupes, tapez sales pour effectuer une recherche par caractères génériques. Plusieurs entités doivent être retournées, comme l’illustre la figure 10.

    Notes

    Vous ne pouvez pas spécifier le fournisseur de revendications comme vous le permet la boîte de dialogue Parcourir. Vous pouvez cliquer sur Plus de noms pour afficher la boîte de dialogue Parcourir.

    Figure 10. Recherche par caractères génériques

    Recherche par caractères génériques

Étape 8 : débogage d’un fournisseur de revendications

Ensuite, à partir des connaissances acquises au cours des étapes de test précédentes, déboguez l’augmentation des revendications et le processus d’exploration et de résolution :

  • Si vous déboguez le processus d’augmentation des revendications, pour le service d’émission de jeton de sécurité SharePoint, vous devez établir une liaison à w3wp.exe.

  • Si vous déboguez l’exploration des revendications ou la résolution des revendications pour votre application Web, établissez une liaison à w3wp.exe.

  • Si vous avez apporté des modifications au fournisseur de revendications, vous devez exécuter une commande iisreset, car Microsoft Visual Studio 2010 ne recycle pas le processus du service d’émission de jeton de sécurité SharePoint ; or il est possible que ce processus référence encore l’ancienne version du fournisseur de revendications.

Étape 9 : ajout de la prise en charge d’un compte Windows

Ensuite, vous activez la prise en charge de l’authentification Windows et de l’authentification par formulaire pour http://intranet.contoso.com:200.

Pour ajouter la prise en charge d’un compte Windows

  1. Lancez le site Web Administration centrale.

  2. Dans le volet de navigation de gauche, cliquez sur Sécurité.

  3. Sous la section Sécurité générale, cliquez sur Spécifier des fournisseurs d’authentification.

  4. Dans la liste déroulante Application Web, sélectionnez http://intranet.contoso.com:200.

  5. Sous Zone, cliquez sur Par défaut comme le montre la figure 11.

    Figure 11. Page Fournisseurs d’authentification

    Page Fournisseurs d’authentification

  6. Activez la case à cocher Activer l’authentification Windows, puis la case à cocher Authentification Windows intégrée, comme le montre la figure 12.

    Figure 12. Sélection des types d’authentification des revendications

    Sélection des types d’authentification des revendications

  7. Cliquez sur Enregistrer.

  8. Exécutez la commande iisreset.

  9. Revenez au code source du fournisseur de revendications et vérifiez que votre compte de domaine a été ajouté au tableau userDB.

    Notes

    Dans cet exemple, nous avons ajouté le rôle SalesManager pour contoso\administrator.

            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
               };
    
  10. Accédez à http://intranet.contoso.com:200.

  11. Ouvrez une session à l’aide des informations d’identification admin1/pass@word1.

  12. Dans le menu Actions du site, cliquez sur Autorisations de site.

  13. Si ce n’est déjà fait, accordez au rôle SalesManager un droit d’accès au site.

  14. Dans la liste déroulante située dans le coin supérieur droit, cliquez sur Se connecter en tant qu’utilisateur différent.

  15. La page du sélecteur de plusieurs méthodes d’authentification apparaît, comme le montre la figure 13.

    Figure 13. Page du sélecteur de plusieurs méthodes d’authentification

    Page du sélecteur de plusieurs méthodes d’authentification

  16. Dans la liste déroulante, sélectionnez Authentification Windows. Vous devez être automatiquement connecté au site.

    Notes

    Lorsque vous sélectionnez Authentification Windows, vous êtes redirigé vers /_windows/default.aspx, ce qui permet d’effectuer une authentification NTLM en mode silencieux. Ensuite, vous êtes redirigé vers le site.

  17. Observez le composant WebPart Visionneuse de revendications et déterminez les revendications qui ont été ajoutées pour contoso\administrator.

Étape 10 : modification de l’étendue des revendications

Vous allez effectuer cette étape tout seul. La tâche consiste à créer une collection de sites sous http://intranet.contoso.com/sites/CRMDocs. Ensuite, ajoutez les informations suivantes au site :

  • Bibliothèque de documents : CustomerDocs

  • Liste personnalisée : East_Customers

Nous souhaitons que ce fournisseur de revendications soit le seul fournisseur de revendications disponible pour ce site.

Les objectifs sont les suivants :

  • Si un utilisateur se connecte à http://intranet.contoso.com, son jeton de revendications ne doit contenir aucune revendication de GRC. Le composant WebPart Visionneuse de revendications n’affiche aucune revendication liée à la GRC.

  • Seuls les utilisateurs pour lesquels CRMRole=Reader peuvent se connecter au site http://intranet.contoso.com/sites/CRMDocs.

  • Les utilisateurs pour lesquels CRMRole=Executive peuvent accéder à la bibliothèque CustomerDocs.

  • Les utilisateurs pour lesquels CRMRegion=East peuvent accéder à la liste East_Customers.

Effectuez cette tâche en vous appuyant sur les connaissances que vous avez acquises. Pour mieux comprendre dans les moindres détails la procédure à effectuer, vous pouvez noter votre code.

Conclusion

Dans cette procédure pas à pas, vous apprenez à créer un fournisseur de revendications pour une application Web SharePoint 2010 qui utilise l’authentification par formulaire, puis vous testez ce fournisseur de revendications.

Annexe A : table des caractères de codage des revendications d’identité

Tableau 1. Codage des types de revendications

Caractère

Type de revendication

!

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

Tableau 2. Codage des types de valeur de revendication

Caractère

Type de revendication

!

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

Ressources supplémentaires

Pour plus d’informations, consultez les ressources suivantes :