Procédure pas à pas : implémentation d'un fournisseur d'authentification unique enfichable
Par défaut, Microsoft Office SharePoint Server 2007 fournit le service d'authentification unique Microsoft Single Sign-On (SSO) pour le stockage et le mappage des informations d'identification à utiliser lors de la connexion à un système principal ou tiers. La plupart des entreprises ont déjà développé un système de stockage d'informations d'identification en interne ou utilisent une autre solution que le service d'authentification unique Microsoft Single Sign-On. Pour éviter de devoir conserver le mappage des informations d'identification à deux endroits, Office SharePoint Server 2007 offre un mécanisme appelé authentification unique enfichable, qui permet de spécifier un autre fournisseur d'authentification unique que celui d'Office SharePoint Server 2007.
Conditions préalables requises
Avant de créer le fournisseur d'authentification unique, vous devez configurer votre environnement. Cette procédure pas à pas suppose que vous avez configuré Office SharePoint Server 2007, installé une copie de la base de données AdventureWorks 2000 à partir du Centre de téléchargement Microsoft et vérifié que le nom de domaine correspond à LITWAREINC. Si vous utilisez un autre nom de domaine, vous devez modifier les exemples de code de cette procédure pas à pas.
Les groupes et comptes de domaine contenus dans le tableau ci-après sont supposés exister.
ExternalPartners |
Groupe de domaine |
InternalSales |
Groupe de domaine |
Tom Tompson |
Utilisateur du domaine |
Jerry Jones |
Utilisateur du domaine |
InternalAccess |
Utilisateur du domaine |
ExternalAccess |
Utilisateur du domaine |
Pour obtenir des instructions complètes pour configurer la base de données et les comptes d'utilisateurs nécessaires, voir le fichier README.txt fourni avec la base de données AdventureWorks 2000.
Implémentation d'un fournisseur d'authentification unique
Remplacer le fournisseur d'authentification unique d'Office SharePoint Server 2007 implique l'implémentation de l'interface Microsoft.SharePoint.Portal.SingleSignon.ISsoProvider****, son installation dans le Global Assembly Cache et l'inscription du nouveau fournisseur d'authentification unique auprès d'Office SharePoint Server 2007.
Vous ne pouvez inscrire qu'un seul fournisseur d'authentification unique pour Office SharePoint Server 2007. L'inscription d'un nouveau fournisseur d'authentification unique entraîne le remplacement de la classe SpsSsoProvider par défaut dans Office SharePoint Server 2007. Étant donné qu'un seul fournisseur ne peut être utilisé à la fois, il est conseillé d'arrêter le service d'authentification unique Microsoft Single Sign-On lors de l'utilisation d'un fournisseur personnalisé.
Vous devez implémenter les méthodes GetCredentials et GetSsoProviderInfo de l'interface ISsoProvider pour créer un fournisseur d'authentification unique avec un niveau fonctionnel minimal. Cette procédure pas à pas montre comment créer un fournisseur d'authentification unique simple et l'utiliser pour accéder aux données via le catalogue de données métiers.
Dans cette procédure pas à pas, le fournisseur d'authentification unique mappe les utilisateurs du groupe InternalSales au compte d'utilisateur InternalAccess pour extraire les données des produits de la base de données AdventureWorks 2000.
Création du fournisseur
Cette section montre comment créer et installer un fournisseur d'authentification unique simple. Elle décrit également la gestion des exceptions du fournisseur.
Téléchargements Pour télécharger l'exemple de fournisseur, voir Kit de développement logiciel (SDK) de SharePoint Server 2007 Server .
Exemple
Vous devez créer un assembly de fournisseur d'authentification unique dans Microsoft Visual Studio 2005 en créant un projet Bibliothèque de classes. Vous devez ensuite ajouter dans cotre projet une référence au fichier Microsoft.SharePoint.Portal.SingleSignon.dll (situé dans le répertoire %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\12\ISAPI
). Vous devez enfin implémenter l'interface ISsoProvider, comme illustré dans le code ci-après.
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
using System.Web;
using System.Web.Services;
using Microsoft.SharePoint.Portal.SingleSignon;
namespace SampleSSOProvider
{
/// <summary>
/// SimpleSSOProvider
/// </summary>
public class SimpleSSOProvider: ISsoProvider
{
public Application.ApplicationInfo[] GetApplicationDefinitions()
{
//NOTE: Used by SpsSsoProvider, not necessary for SimpleSSOProvider
throw new NotSupportedException();
}
public Application.ApplicationField[] GetApplicationFields(string AppID)
{
//NOTE: Used by SpsSsoProvider, not necessary for SimpleSSOProvider
throw new NotSupportedException();
}
public Application.ApplicationInfo GetApplicationInfo(string AppID)
{
Application.ApplicationInfo applicationInfo = new Application.ApplicationInfo("SimpleSSOProvider", "SimpleSSOProvider", Application.ApplicationType.GroupWindows, "sso@litwareinc.com");
Application.ApplicationInfo applicationInfo = new Application.ApplicationInfo("SimpleSSOProvider","SimpleSSOProvider",Application.ApplicationType.GroupWindows,"sso@litwareinc.com", (SsoCredentialContents)((Int32)SsoCredentialContents.UserName + (Int32)SsoCredentialContents.Password + (Int32)SsoCredentialContents.WindowsCredentials));
*/
return applicationInfo;
}
public Uri GetCredentialManagementURL(string AppID)
{
//NOTE: Used by SpsSsoProvider, not necessary for SimpleSSOProvider
throw new NotSupportedException();
}
public SsoCredentials GetCredentials(string AppID)
{
//Note: Used by SpsSsoProvider, necessary for any SimpleSSO Provider. Implementation discussed in detail in the next section of this topic
}
public SsoCredentials GetCredentialsUsingTicket(string Ticket, string AppID)
{
//NOTE: Used by SpsSsoProvider, necessary for Simple SSO Provider when used by Excel Services.
//TODO: Implement Ticket management code; currently just return SsoCredentials
return GetCredentials(AppID);
}
public string GetCurrentUser()
{
//NOTE: Used by SpsSsoProvider, not necessary for SimpleSSOProvider
throw new NotSupportedException();
}
public SsoCredentials GetSensitiveCredentials(string AppID)
{
//NOTE: Used by SpsSsoProvider, necessary for Simple SSOProvider when used by Excel Services
//TODO: Implement Sensitive Credential method, for sample just returning basic credentials
return GetCredentials(AppID);
}
public SsoProviderInfo GetSsoProviderInfo()
{
//TODO: Used by SpsSsoProvider, necessary for any SimpleSSOProvider
}
public string GetTicket()
{
//NOTE: Used by SpsSsoProvider, necessary for SimpleSSOProvider when used by Excel Services
//TODO: Implement Ticket management code; currently just return a string
return "No Ticket Management";
}
public void PutIdentityOnRequest(ref System.Web.Services.Protocols.HttpWebClientProtocol request, string AppID)
{
//NOTE: Used by SpsSsoProvider, not necessary for SimpleSSOProvider
throw new NotSupportedException();
}
public void PutIdentityOnRequestUsingTicket(ref System.Web.Services.Protocols.HttpWebClientProtocol request, string Ticket, string AppID)
{
//NOTE: Used by SpsSsoProvider, not necessary for SimpleSSOProvider
throw new NotSupportedException();
}
}
}
Vous devez au moins implémenter les méthodes GetCredentials et GetSsoProviderInfo. La SimpleSSOProvider classe que nous avons créée retourne les nouvelles informations d'identification selon l'utilisateur actuel et l'identificateur d'application (AppID) spécifiés. Nous pouvons obtenir des informations sur l'utilisateur actuel à l'aide de la propriété CurrentPrincipal property du thread d'exécution (System.Threading.Thread.CurrentPrincipal). Le code ci-après illustre l'implémentation de la méthode GetCredentials.
public SsoCredentials GetCredentials(string AppID)
{
//NOTE: Used by SpsSsoProvider, necessary for any SimpleSSOProvider
System.Diagnostics.Trace.WriteLine("Entering SimpleSSOProvider::GetCredentials");
System.Diagnostics.Trace.Indent();
// Retrieve the logged in user's information
string domain = System.Environment.UserDomainName;
System.Diagnostics.Trace.WriteLine("User domain is " + domain);
try {
System.Diagnostics.Trace.WriteLine("Context user:" + System.Threading.Thread.CurrentPrincipal.Identity.Name);
// Start building an SsoCredentials object to store two values - UserName and Password
SsoCredentials creds = new SsoCredentials();
creds.Evidence = new System.Security.SecureString[2];
switch (AppID){
case "AdventureWorks":
System.Diagnostics.Trace.WriteLine("Application is AdventureWorks");
if (System.Threading.Thread.CurrentPrincipal.IsInRole("InternalSales"))
{
System.Diagnostics.Trace.WriteLine("User is in InternalSales? " + System.Threading.Thread.CurrentPrincipal.IsInRole("InternalSales"));
// Provide components for the InternalAccess account token
creds.Evidence[0] = MakeSecureString(domain + "\\InternalAccess");
creds.Evidence[1] = MakeSecureString("pass@word1");
}
else
{
// Provide components for the ExternalAccess account token
creds.Evidence[0] = MakeSecureString(domain + "\\ExternalAccess");
creds.Evidence[1] = MakeSecureString("pass@word1");
}
break;
default:
throw new SingleSignonException(SSOReturnCodes.SSO_E_APPLICATION_NOT_FOUND);
}
// Put the UserName/Password values into the credential object
creds.UserName = creds.Evidence[0];
creds.Password = creds.Evidence[1];
System.Diagnostics.Trace.Unindent();
return creds;
}
catch(SingleSignonException ex) {
System.Diagnostics.EventLog.WriteEntry("SimpleSSOProvider", "Caught SSO Exception: " + ex.ToString());
throw;
}
catch(Exception ex) {
System.Diagnostics.EventLog.WriteEntry("SimpleSSOProvider", "Caught Exception: " + ex.ToString());
throw new SingleSignonException(SSOReturnCodes.SSO_E_EXCEPTION, ex);
}
}
Bien que l'implémentation de SsoProvider ne requière pas SsoCredentialsContents, certaines autres applications clientes peuvent attendre cette valeur. Dans l'exemple fourni, Services Excel tentera de se connecter aux ressources à l'aide d'une connexion Windows utilisant les UserName et Password spécifiés. Si aucune valeur n'est spécifiée pour WindowsCredentials, les UserName et Password doivent être définis sur la chaîne de connexion.
Nom | Description |
---|---|
None |
Aucune preuve n'a été fournie. |
UserName |
Défini si UserName existe. |
Password |
Défini si Password existe. |
Evidence |
Défini en cas d'utilisation de champs étendus (jusqu'à cinq maximum, dont UserName et Password). |
MappedGroup |
Défini si la définition d'application est une définition Group. |
WindowsCredentials |
Défini si la définition d'application est l'authentification Windows. |
La méthode GetSsoProviderInfo retourne juste des informations sur le fournisseur, telles que le nom de l'éditeur (vendor) et la version, comme illustré dans le code ci-après.
public SsoProviderInfo GetSsoProviderInfo()
{
//NOTE: Used by SpsSsoProvider, necessary for any SimpleSSOProvider
SsoProviderInfo ssoProvInfo = new SsoProviderInfo();
ssoProvInfo.AssemblyName = Assembly.GetExecutingAssembly().FullName;
ssoProvInfo.Vendor = "AdventureWorks";
ssoProvInfo.Version = "1.0";
return ssoProvInfo;
}
Si le fournisseur d'authentification unique sera utilisé par Services Excel, vous devez également fournir une implémentation des méthodes GetCredentialsUsingTicket et GetTicket.
La classe SimpleSsoProvider que nous avons créée illustre un exemple très simple de fournisseur d'authentification unique. Dans la réalité, une implémentation doit récupérer les informations d'identification à partir d'un référentiel sécurisé et protéger les valeurs lors de leur mise en mémoire.
L'objet SsoCredentials, retourné par GetCredentials, utilise la classe SecureString pour stocker les propriétés UserName et Password, ainsi que les valeurs Evidence. SecureString chiffre ses données de sorte qu'elles ne puissent pas être déchiffrées facilement.
Gestion des exceptions
Le fournisseur SimpleSSOProvider génère une instance de SingleSignonException et utilise les champs SSOReturnCodes standard s'il ne parvient pas à déterminer correctement l'AppID. Le tableau ci-après contient quelques champs SSOReturnCodes courants pour plusieurs cas d'erreur.
Nom | Description |
---|---|
SSO_E_ACCESSDENIED |
Accès refusé. |
SSO_E_CREDS_NOT_FOUND |
Impossible de trouver les informations d'identification de l'utilisateur ou de l'application demandée. |
SSO_E_SSO_NOT_CONFIGURED |
Le service du fournisseur d'authentification unique n'est pas correctement configuré. |
SSO_E_APPLICATION_NOT_FOUND |
Impossible de trouver la définition d'application. |
SSO_E_EXCEPTION |
Le fournisseur d'authentification unique a généré une exception. |
Inscription du fournisseur
Pour installer le fournisseur SimpleSSOProvider, vous devez l'inscrire dans le Global Assembly Cache, puis l'inscrire à l'aide de l'application console ProviderAdmin (située dans le répertoire bin de l'installation Office SharePoint Server 2007). L'application ProviderAdmin remplace le fournisseur d'authentification unique actuel par celui spécifié. Dans un environnement de batterie de serveurs, vous devez inscrire le nouveau fournisseur d'authentification unique auprès de chaque ordinateur de la batterie. Les procédures ci-après montrent comment inscrire le fournisseur, le supprimer et rétablir le fournisseur d'origine.
Pour inscrire le fournisseur SimpleSSOProvider
L'outil ProviderAdmin utilise le nom d'assembly complet de la classe qui implémente l'interface ISsoProvider. Pour inscrire le fournisseur SimpleSSOProvider dans notre exemple, l'outil ProviderAdmin exécute la commande ci-après.
Microsoft.SharePoint.Portal.SingleSignon.ProviderAdmin.exe "SampleSSOProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e447e624e7099fd1" "SampleSSOProvider.SimpleSSOProvider"
Pour supprimer un fournisseur d'authentification unique personnalisé et rétablir le fournisseur d'origine
Pour supprimer un fournisseur d'authentification unique personnalisé et rétablir le fournisseur d'origine dans Office SharePoint Server 2007, annulez l'inscription du fournisseur d'authentification unique à l'aide de la commande ci-après.
Microsoft.SharePoint.Portal.SingleSignon.ProviderAdmin.exe /u
Accès au fournisseur d'authentification unique
Les composants WebPart ou les autres types de composants ayant besoin d'accéder à un fournisseur d'authentification unique ne doivent plus utiliser l'objet Credentials. L'utilisation de l'objet Credentials ne permet que la récupération du fournisseur d'authentification unique par défaut d'Office SharePoint Server 2007, et ce même si un nouveau fournisseur a été inscrit à l'aide de l'outil ProviderAdmin. Pour obtenir une référence au ISsoProvider actuellement inscrit, effectuez la procédure ci-après.
Pour obtenir une référence au fournisseur d'authentification unique actuellement inscrit
Utilisez la méthode GetSsoProvider de la classe SsoProviderFactory pour obtenir une référence au ISsoProvider actuellement inscrit. Le code peut avoir recours à la méthode GetCredentials de l'interface ISsoProvider pour obtenir les informations d'identification de l'application, comme illustré ci-après.
ISSOProvider issop; issop = SsoProviderFactory.GetSsoProvider(); SsoCredentials ssocred = issop.GetCredentials("AdventureWorks");
La classe SsoCredentials fournit un accès aux informations d'identification au moyen de la classe SecureString. Vous pouvez utiliser plusieurs méthodes différentes pour convertir une instance SecureString en format utilisable, telle que la méthode SecureStringToBSTR, comme illustré dans l'exemple ci-après.
ISsoProvider provider = SsoProviderFactory.GetSsoProvider();
SsoCredentials creds = provider.GetCredentials("AdventureWorks");
IntPtr pUserName = IntPtr.Zero;
try
{
pUserName = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(creds.UserName);
//NOTE: After this has been converted to a String object, it remains in
//memory until the garbage collector collects it.
String userName = System.Runtime.InteropServices.Marshal.PtrToStringBSTR(pUserName);
}
finally
{
// Free zero out and free the BSTR pointers.
if (IntPtr.Zero != pUserName)
{
System.Runtime.InteropServices.Marshal.ZeroFreeBSTR(pUserName);
}
}
Utilisation du fournisseur d'authentification unique à partir du catalogue de données métiers
Outre l'accès au fournisseur d'authentification unique par défaut par le biais des composants WebPart, vous pouvez également utiliser le fournisseur d'authentification unique personnalisé à partir des applications inscrites dans le catalogue de données métiers.
Pour utiliser le fournisseur d'authentification unique avec le catalogue de données métiers
Pour utiliser le fournisseur d'authentification unique personnalisé avec un système métier de base de données, modifiez le schéma du catalogue de données en ajoutant les propriétés SsoApplicationId et SsoProviderImplementation à la balise XML LOBSystemInstance, comme illustré ci-après.
<LobSystemInstance Name="AdventureWorks2000(SampleSSO)"> <Properties> <Property Name="AuthenticationMode" Type="System.String">WindowsCredentials</Property> <Property Name="SsoApplicationId" Type="System.String">AdventureWorks</Property> <Property Name="SsoProviderImplementation" Type="System.String">SampleSSOProvider.SimpleSSOProvider, SampleSSOProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e447e624e7099fd1</Property> <!—Database connection properties elided --> </Properties> </LobSystemInstance>
Étant donné que notre fournisseur retourne des informations d'identification Windows, la propriété AuthenticationMode est définie sur WindowsCredentials. Lorsque le catalogue de données métiers récupère les informations d'identification du fournisseur d'authentification unique, il exécute un appel LogonUser() pour configurer l'emprunt d'identité avant de tenter d'accéder à la base de données.
Dans notre exemple, un utilisateur est mappé au compte InternalAccess ou ExternalAccess pour extraire des données de produits d'une base de données AdventureWorks 2000.
Pour plus d'informations sur le schéma du catalogue de données métiers, notamment sur la configuration nécessaire pour implémenter l'authentification unique pour des systèmes métier de service Web, voir LobSystemInstance dans la rubrique Catalogue de données métiers : modèle de métadonnées.
Étapes suivantes
La possibilité de remplacer le fournisseur d'authentification unique par défaut d'Office SharePoint Server 2007 vous permet de mieux intégrer vos sites SharePoint dans les investissements déjà réalisés dans votre entreprise. Vous pouvez avoir recours aux banques d'informations d'identification préexistantes développées en interne ou fournies dans une solution tierce. Des composants WebPart ou des objets de catalogue de données métiers peuvent alors accéder à votre fournisseur personnalisé pour en tirer pleinement parti.