Archives du mot-clé secure store services

Création d’un type de contenu externe et utilisation du secure store service via Visual Studio 2012


Cet article fait partie d’une série concernant la mise en oeuvre de liste externes et de workflows avec SharePoint. Les étapes seront passées en revue :

_______________________________________________________________________________________________

Après avoir vu comment créer une application dans le secure store service puis s’en servir pour créer un type de contenu externe avec l’interface utilisateur SharePoint Designer 2013, voyons maintenant comment faire de même en programmation avec Visual Studio 2012.

Pour cela nous allons créer un accès complet à la table « Person » de la base « AdventureWorks2012 » avec le  Secure Store Service  de la manière suivante  :

Création du modèle BDC avec classes LINQ d’accès aux données

1 – Créer un projet de type SharePoint 2013 Vide

Visual Studio 2012 SharePoint 2013

2 – Sélectionner « déployer en tant que solution de batterie » (en effet un type de contenu externe ne se déploie qu’au niveau « farm »).

SharePoint 2013 - spalexandre

3 – Ajouter un nouvel élément de type « Modèle de connectivité de données métiers » au projet.

 Modèle de connectivité de données métiers (solution de batterie uniquement) spalexandre

4  – Se connecter à la base de données cible (ici de type SQL Server pour AdventureWorks2012).spalexandre sharepoint 2013

SQL Server datasource visual studio 2012

connexion base de données sharepoint 2013

5 – Ajouter une classe d’accès aux données au projet (Ajouter nouvel élément -> données -> classes Linq To SQL). Ceci dépend du type de source de données auquel vous avez affaire. Choisissez celui qui correspond ou créer votre propre classe d’accès aux données.classes Linq to SQL

6 – une fois le .dbml ouvert, ouvrir l’explorateur de serveur, sélectionner celui qui concerne la connexion ajoutée puis la(les) table(s) qui vous intéresse et glisser la(les) sur le designer.

visual studio 2012 designer LINQ entity

Dans mon cas, 2 classes ont été créées dans le fichier AdventureWorks.deigner.cs  : DataContext et Person. Le modèle de données de la table a été transformé en modèle objet, la table « Person » pourra donc être manipulé comme un objet C#, le type de ses propriétés étant mappé sur le type de colonne de la table en base de données. Ceci permet de simplifier l’accès aux données et va permettre de construire facilement via des requête LINQ des méthodes de CRUD pour notre entité.

7 – Supprimer les entités par défaut du modèle BDC. Pour cela ouvrir le designer en double cliquant sur « AventureWorksPerson » puis clic droit sur l’entité -> supprimer. Supprimer également les fichier Entity1.cs et Entity1Service.cs dans l’explorateur de solutions.

Delete entity visual studio 2012

8 – Ajouter une nouvelle entité sur le designer via la boite à outil en glisser déposer puis la renommer via la fenêtre de propriétés et définir un identificateur via clic droit sur le modèle puis définir son type.

Business data connectivity SharePoint 2013

propriété visual studio 2012

Propriétés visual studio 2012 BDCM

visual studio 2012 bcs

Accès au Secure Store  Service et récupération des informations d’authentification

1 – Ajouter un nouvel élément au projet de type Code -> Classe C#.

secure store service programmatically

2 – référencer les DLL suivantes :

  • Microsoft.Office.SecureStoreService située dans « C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.Office.SecureStoreService\v4.0_15.0.0.0__71e9bce111e9429c »
  • Microsoft.BusinessData située dans « C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\ISAPI\ »

3 – Ajouter le code suivant au fichier :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint;
using System.Runtime.InteropServices;
using System.Security;
using Microsoft.BusinessData.Infrastructure.SecureStore;
using Microsoft.Office.SecureStoreService.Server;

namespace SPAlex.Labs
{
    public static class SecureStoreUtils
    {
        public static Dictionary<string, string> GetCredentials(string applicationID)
        {
            var credentialMap = new Dictionary<string, string>();
            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                SPServiceContext serviceContext = SPServiceContext.Current;
                var secureStoreProvider = new SecureStoreProvider { Context = serviceContext };
                using (var credentials = secureStoreProvider.GetCredentials(applicationID))
                {
                    var fields = secureStoreProvider.GetTargetApplicationFields(applicationID);
                    for (var i = 0; i < fields.Count; i++)
                    {
                        var field = fields[i];
                        var credential = credentials[i];
                        var decryptedCredential = ToClrString(credential.Credential);

                        credentialMap.Add(field.Name, decryptedCredential);
                    }
                }
            });
            return credentialMap;
        }

        public static string ToClrString(this SecureString secureString)
        {
            var ptr = Marshal.SecureStringToBSTR(secureString);

            try
            {
                return Marshal.PtrToStringBSTR(ptr);
            }
            finally
            {
                Marshal.FreeBSTR(ptr);
            }
        }

        public static string getSQLConnectionString(string applicationID, string serverName, string dataBaseName)
        {
            Dictionary<string, string> creds = GetCredentials (applicationID);
            string connectionString = string.Format(@"Data Source={0};Initial Catalog={1};User Id={2};Password={3};",
                serverName,
                dataBaseName,
                creds["Nom d'utilisateur SQL"],
                creds["Mot de passe SQL"]);

            return connectionString;
        }
    }
}

Attention à utiliser les mêmes noms de champs que ceux renseignés lors de la création de votre application dans le Secure Store Service pour récupérer les credentials dans le méthode getConnectionString.

Création des méthodes de CRUD pour le type de contenu externe

Recherche d’élément spécifique (readItem)

1 – Afin de permettre au service SharePoint de pouvoir faire des opérations de CRUD sur notre base de donnée externe, il faut définir les méthodes qui permettent d’accéder à ces données via le modèle de données créé précédemment et basé sur notre connexion. Dans notre cas nous allons créer des méthodes de recherche. Pour cela cliquer sur la partie « méthodes » de votre entité afin de voir apparaître la fenêtre ‘« détails de la méthode BDC » puis sélectionner « Créer une méthode de recherche spécifique » comme suit :

détails de la méthode BDC Visual Studio 2012

2 – Modifier le type de paramètre de retour de cette méthode afin de décrire l’ensemble des propriétés de l’objet « personne ».

modifier le descripteur de type visual studio 2012

Dans la fenêtre propriétés pour la valeur « Nom de type » sélectionner projet actif -> PERSONNE afin de mapper le type d’objet retourné avec l’entité de mapping LINQ.

descripteur de type business data connectivity

3 – Ajouter tous vos descripteurs de types correctement typés 🙂 via l’explorateur de BDC.

explorateur bdc visual studio 2012 - descripteur de type

Ajouter le premier en modifiant son nom / son type et en le sélectionnant en tant qu’identifiant dans la fenêtre propriétés.

identificateur explorateur de BDC visual studio 2012

Ajouter tout ceux qui correspondront aux éléments qui vous voudrez utiliser dans votre liste externe SharePoint 2013. Ne pas oublier de les typer.

Descripteur de type visual studio 2012

4 – Dans le fichier PersonneServices.cs déclarer les constantes suivantes (qui peuvent être stockées en SPPersistedObject ou dans le propertyBag niveau Ferme via un featureReceiver) :


private const string serverName = @"SPALEXANDRE\SQLSHAREPOINT";
private const string dataBaseName = "AdventureWorks2012";
private const string sssAppId = "AdventureWorks2012";

5 – Transformer les méthode ReadItem créée automatiquement avec le code suivant :

public static PERSONNE ReadItem(int BusinessEntityID)
{
string connectString = SecureStoreUtils.getSQLConnectionString(sssAppId, serverName, dataBaseName);
AventureWorksDataContext dataContext = new AventureWorksDataContext(connectString);

PERSONNE myPersonne =
(from p in dataContext.PERSONNE.AsEnumerable()
where p.BusinessEntityID == BusinessEntityID
select p).Single();
return myPersonne;
}

Cette méthode récupère un enregistrement à partir de la table personne de la BDD AdventureWorks  en fonction de son ID. La chaîne de connexion du dataContext Linq  est construite avec les credentials du l’utilisateur SQL stocké dans le Secure Store Service pour cette application.

Résultat :

recherche élément type de contenu externe

Recherche globale (ReadList)

1 – ajouter une nouvelle méthode de recherche.

méthode de recherche BDC

2 – remplacer le code de la méthode générée par le code suivant :


public static IEnumerable ReadList()
{
string connectString = SecureStoreUtils.getSQLConnectionString(sssAppId, serverName, dataBaseName);
AventureWorksDataContext dataContext = new AventureWorksDataContext(connectString);

IEnumerable pList = from p in dataContext.PERSONNE.Take(1000) select p;
return pList;
}

Cette méthode récupère les 1000 premières lignes de la table SQL (pour rappel au delà de 2000 ça n’est pas possible).

Une fois les méthodes de recherche créée la solution peut être compilée, déployée et testé en créant une liste externe basée sur ce nouveau type de contenu manuellement dans le site cible. Les données devrait être accessible sauf problème de droits d’accès (plutôt récurrents dans ce cas).

Résultat :

Recherche type de contenu externe

Création (Create)

1 – Ajouter une méthode de création dans la fenêtre « Détails de la méthode BDC »  comme suit :

BCS create

2 – remplacer le code de la méthode par le code suivant :


        public static PERSONNE Create(PERSONNE newPersonne)
        {
            string connectString = SecureStoreUtils.getSQLConnectionString(sssAppId, serverName, dataBaseName);
            AventureWorksDataContext dataContext = new AventureWorksDataContext(connectString);

            PERSONNE myPers = new PERSONNE();
            myPers.BusinessEntityID = newPersonne.BusinessEntityID;
            myPers.FirstName = newPersonne.FirstName;
            myPers.LastName = newPersonne.LastName;

            //propriétés annexes ajoutées de par les contraintes de base de données
            myPers.ModifiedDate = DateTime.Now;
            myPers.PersonType = "EM";
            myPers.EmailPromotion = 0;
            myPers.NameStyle = false;
            myPers.rowguid = new Guid();

            dataContext.PERSONNE.InsertOnSubmit(myPers);
            dataContext.SubmitChanges();
            return myPers;
        }

Si vous aviez déjà créé une liste externe dans SharePoint afin de tester les éléments de recherche, il faudra la supprime et la recréer pour tester cette méthode sinon vous aurez l’erreur suivante : « Impossible de trouver le formulaire de création par défaut pour la liste XXX ».

résultat : newform BCS

Mise à jour (Update)

1 – Ajouter une méthode de mise à jour dans la fenêtre « Détails de la méthode BDC »  comme suit :

BCS update

2 – Modifier les propriété du paramètre en INPUT si le champs ID n’est pas en lecture seule (ce qui est mon cas) afin de cocher la prorpiété champs de pré-mise à jour (PreUpdaterField)  à TRUE.

PreUpdaterField true

3 – remplacer le code de la méthode par le code suivant :

public static void Update(PERSONNE personne)
 {
 string connectString = SecureStoreUtils.getSQLConnectionString(sssAppId, serverName, dataBaseName);
 AventureWorksDataContext dataContext = new AventureWorksDataContext(connectString);

PERSONNE myPersonneToUPdate =
 (from p in dataContext.PERSONNE.AsEnumerable()
 where p.BusinessEntityID == personne.BusinessEntityID
 select p).Single();

myPersonneToUPdate.FirstName = personne.FirstName;
 myPersonneToUPdate.LastName = personne.LastName;
 dataContext.SubmitChanges();

}

résultat :

update type de contenu externe programmation

Suppression (Delete)

1 – Ajouter une méthode de suppression dans la fenêtre « Détails de la méthode BDC »  comme suit :

BCS Delete

2 – remplacer le code de la méthode par le code suivant :


public static void Delete(int businessEntityID)
        {
            string connectString = SecureStoreUtils.getSQLConnectionString(sssAppId, serverName, dataBaseName);
            AventureWorksDataContext dataContext = new AventureWorksDataContext(connectString);

            PERSONNE myPersonneToDelete =
             (from p in dataContext.PERSONNE.AsEnumerable()
              where p.BusinessEntityID == businessEntityID
              select p).Single();

            dataContext.PERSONNE.DeleteOnSubmit(myPersonneToDelete);
            dataContext.SubmitChanges();
        }
    }

résultat :

Delete external content type

N.B : Cette méthode n’est pas fonctionnelle aujourd’hui pour ce type d’élément dans le cas de la base AdventureWorks2012 car il faudrait supprimer toutes les dépendances associées. Mais le principe est là 🙂

Pour déploiement et test via une liste externe créé par programmation c’est par ici.

Publicités

Configuration du Secure Store Service et ajout d’une application afin de créer un type de contenu externe


Cet article fait partie d’une série concernant la mise en oeuvre de liste externes et de workflows avec SharePoint. Les étapes seront passées en revue :

_______________________________________________________________________________________________

Le service de banque d’informations sécurisé dans SharePoint 2013

Le service Banque d’informations sécurisé est un service d’autorisation qui s’exécute sur un serveur d’applications. Il permet de stocker les informations d’identification requises pour   d’accéder à une ou plusieurs application(s) tierce(s) dans une base de données chiffrée. Il permet d’éviter, entre autres, les problèmes d’authentification dans un « double-hop » et parfois de s’affranchir d’une authentification Kerberos, bien que celle-ci soit souvent mise en oeuvre pour d’autres cas d’usage (utilisation du profil de l’utilisateur directement plutôt qu’un compte générique permettant l’impersonification).

La mise en oeuvre de ce service

  1. Il faut au préalable avoir identifié le compte géré (ex : spserviceapps) ainsi que le pool d’application qui seront utilisés pour exécuter cette application de service.
  2. Tout d’abord commencez par démarrer le service de Banque d’information sécurisé sur le serveur d’applications SharePoint 2013.
  3. Ensuite il faut créer l’application de services Banque d’informations sécurisé (procédure simple). 

Les procédures détaillées sont simples et visibles ici.

L’ajout d’une application

1 – Générer une nouvelle clé pour le chiffrement / déchiffrement de la base données associée à l’application de service.

Génération clé banque de données sécurisées

2 – Cliquer sur « Nouveau » puis remplissez le formulaire avec les informations de votre application tiece

Création application secure store service

Formulaire application cible du magasin sécurisé

Image 059

Dans mon cas il s’agit de la base de données AventureWorks2012 avec une authentification Windows donc rien de plus simple.

3 – Il est ensuite possible de définir les informations d’authentification qui seront utilisées pour impersonifier l’utilisateur lorsqu’il accédera à l’application cible. J’ai ici donné les login/password de l’administrateur de la base données (sous la forme NDD\user). Un utilisateur qui n’a qu’un accès en lecture à la base serait suffisant, il est également possible d’utiliser un couple login/password pour une authentification SQL plutôt que Windows.

Secure store service

Secure store services

4 – il ne me reste plus qu’à vérifier que je peux accéder à ces informations en créant un type de contenu externe via SharePoint Designer. Pour cela ouvrir son site cible avec SharePoint Designer et créer un type de contenu externe comme suit.

Type de contenu externe SharePoint Designer

5 – Saisir le nom du type de contenu externe puis cliquer sur « découvrir les sources de données externes et définir les opérations » puis sur « ajouter une connexion ».

Type de contenu externe SharePoint Designer

type de contenu externe sharepoint designer

6 – Choisir SQL Server.

SharePoint Designer type de contenu externe

7 – Saisir le nom de votre serveur de base de données ainsi que le nom de la base. Sélectionner « Se connecter avec l’identité Windows empruntée » et saisir le nom de l’application tel qu’il apparaît dans le Magasin de données sécurisées.

Type de contenu externe SharePoint Designer

8 – La connexion à la base est créée il est ainsi possible de créer un ensemble d’opération sur une table définie. Sélectionner la table et cliquer, par exemple, sur « Créer toutes les opérations ».

type de contenu externe sharepoint designer

9 – Dans le Wizzard vérifier que l’ID unique de votre table est bien mappé sur l’identificateur comme suit pour le BusinessEntityID.

secure store service

10 – Sélectionner les colonnes dont la valeur devra être affichée dans le sélecteur (liste déroulante) et cliquer sur « afficher dans le sélecteur. Dans mon cas j’ai choisi FirstName et LastName.

type de contenu externe SharePoint 2013

11 – Si aucun filtre n’est ajouté et que la table à plus de 2000 lignes  l’erreur suivante apparaîtra lorsqu’on essaiera d’afficher notre liste « Le connecteur de base de données a limité la réponse. La réponse de la base de données contient plus de « 2000 » lignes. Le connecteur de base de données peut lire « 2000 » lignes au maximum. La limite peut être modifiée via l’applet de commande « Set-SPBusinessDataCatalogThrottleConfig ». » Il faut alors ajouter un filtre de type « limite » avec la limite par défaut.

Filtre type de contenu externe SharePoint 2013

type de contenu externe sharepoint designer 2013

Editer la valeur par défaut du filtre avec une valeur inférieure à 2000.

sharepoint designer 2013 type de contenu externe

12 – Sauvegarder le type de contenu externe et vérifier que celui-ci est bien créé dans le service Business Connectivity Service via l’administration centrale.

BDC SharePoint 2013

types de contenu externe sharepoint 2013

13 – Il est alors possible d’accorder les autorisations d’accès à ce type de contenu externe pour les utilisateurs cibles.

business connectivyt services sharepoint 2013

14 – Enfin, pour vérifier que ces données sont réellement accessibles depuis notre site SharePoint, créer une liste externe basée sur le type de contenu.

Liste externe SharePoint Designer 2013

Liste externe SharePoint Designer 2013

15 – Vérifier l’accès à cette liste dans votre site SharePoint en lecture et écriture si telles sont les opérations que vous avez autorisé.

SharePoint Designer 2013 liste externe

Liste externe SharePoint 2013

Dans les articles suivants nous verrons faire la même chose via un développement Visual Studio 2012.

Utilisation de Business Connectivity Services dans SharePoint 2013


Cet article fait partie d’une série concernant la mise en oeuvre de liste externes et de workflows avec SharePoint. Les étapes seront passées en revue :

_______________________________________________________________________________________________

Quelques petits éclaircissements au préalable

en effet on s’emmêle encore un peu les pinceaux dans les sigles utilisés (BDC et BCS).

Le BDC était initialement le Business Data Catalog proposé dans la version SharePoint Server 2007 (MOSS). Le même sigle est utilisé pour Business Data Connectivity introduit dans la version SharePoint Foundation 2010 (ils jouent quasiment le même rôle a priori, sauf que le 2nd du nom est gratuit et permet d’écrire dans une source de données externe).

BCS (Business Connectivity Services), quand à lui, est apparu dans SharePoint Foundation 2010 et est disponible pour Foundation, Server (utilisation de listes externes et de la recherche sur des sources externes par exemple) et les clients Office (permet, par exemple, de récupérer une liste de contact externe dans Outlook et de la gérer offline).

Donc, concernant SharePoint 2013, BCS expose et fournit un accès pour SharePoint et Office à BDC qui lui même nous relie à tout un tas de sources de données externes.

Les sources de données

En effet, ce service permet à des utilisateurs finaux de travailler avec un grand nombres de sources de données externes directement depuis l’interface web SharePoint 2013 et Office 2013. Dans les sources on retrouve :

  • les bases de données courantes parmi lesquelles figurent SQL Server, Oracle, IBM DB2 et toute base de données conforme aux normes d’interface ODBC ou OLE DB
  • des services web ou des données publiées en tant que source OData (parmi les sources OData les plus courantes figurent des sites web familiers tels qu’Amazon, E-bay, Azure Data Market et Netflix, des bases de données et même d’autres sites SharePoint)
  • des systèmes de gestion de ressources d’entreprise tels que SAP, Duet, Microsoft Dynamics, Siebel et JD Edwards.
  • des connecteurs personnalisés basés sur :

BCS SharePoint 2013

Mode d’accès à la source de données externe

Il y a fort à parier que l’authentification (le mode ainsi que le couple login/password) soit différente entre SharePoint et la source de donnée externe. Il faut donc se demander si l’utilisateur courant dispose d’un compte pour accéder aux données externes qui lui sont exposées dans SharePoint via le BCS, si ce n’est pas le cas il faudra ouvrir une session avec d’autre information de connexion.

Le service de Banque d’informations sécurisé (Secure store Service) est idéal dans ce scénario car il fournit un stockage et un mappage des informations d’identification, une seule ouverture de session est alors nécessaire. Ce service permet de gérer le problème du « double hop » (cf. schéma ci dessous).

Secure store service and business connectivity service

Pour la configuration du Secure Store Service et la création d’une nouvelle application c’est par ICI 

Les possibilités techniques

Les opération de CRUDQ (Create, Read, Update, Delete, Query) sur la source de données externe vont permettre de :

  • Côté SharePoint
    • Créer des types de contenu externes via SharePoint Designer 2013 ou Visual Studio 2012
    • Lire et écrire des données dans une liste externe
    • Ajouter des colonnes de données externes à des listes et bibliothèques
    • Créer des solutions avec des composants WebPart de données métiers
    • Utiliser des données externes dans des flux de travail
    • Utiliser des données externes dans une page de profil, une action ou une recherche
  • Côté Office
    • Analyser des données externes dans Excel
    • Ajouter des données externes à des documents Word
    • Synchroniser des données externes dans Outlook
    • Améliorer l’accès aux données externes avec des formulaires InfoPath
    • Ajouter des données externes à des diagrammes Visio publiés
    • Importer et actualiser des données externes dans Access

Les cas d’usages

Maintenant que nous avons fait ce petit tour d’horizon, dans quel cas d’usage pourrait on utiliser le BCS ?

  • créer une liste externe SharePoint de données sur le personnel stockée dans une base de données principale, accessible en lecture aux utilisateurs, comme une liste SharePoint native
  • connecter des données client à jour depuis une application métier type CRM en tant qu’ensemble de contacts Outlook et permettre un accès offline
  • Consommer des données publiques accessible en Odata sur http://www.data.gouv.fr/ et les analyser avec Excel
  • créer une application iPad qui viendra consommer les données de listes externes SharePoint 2013 en OData (REST /JSON). Le serveur SharePoint joue le rôle de serveur de médiation ou serveur relai (système de cache, et exposition des données native). Article à venir.
  • utiliser le système de notification SharePoint (event handler) dès qu’un élément est ajouté ou modifié dans la source de données externe (exemple de code ici)

Dans les articles suivants nous nous attarderons sur l’utilisation de données externes provenant d’un SIRH (Système d’Information de Ressources Humaines) au sein d’un Workflow SharePoint 2013. Les étapes seront les suivantes (articles à venir) :

(source : office.microsoft.com)