Étape 2 : ajouter le code pour le composant WebPart personnalisé
Notes
Cette rubrique décrit des fonctionnalités faisant partie de la Infrastructure Update for Microsoft Office Servers. Pour télécharger la mise à jour, consultez Description de la mise à jour pour l’infrastructure des serveurs Microsoft Office datée du 15 juillet 2008.
Le composant WebPart des résultats de la recherche fédérée personnalisée décrit dans cette procédure pas à pas inclut une interface utilisateur qui permet à l’utilisateur d’entrer ses informations d’identification. Le composant WebPart passe ensuite ces informations d’identification à la source de données des résultats fédérés.
L’exemple de composant WebPart décrit dans cette procédure pas à pas fonctionne pour les emplacements fédérés qui sont configurés pour utiliser les types d’authentification par utilisateur suivants :
Authentification de base
Authentification Digest
Authentification NTLM
Les informations d’identification sont chiffrées, puis stockées dans des cookies. Les cookies existent uniquement pendant la session de navigation de l’utilisateur. Lorsque le navigateur est fermé, les cookies expirent et ils ne sont plus disponibles. Vous pouvez modifier cet exemple pour étendre l’expiration du cookie de sorte que les valeurs soient rendues persistantes.
Important
Lorsque vous passez les informations d’identification dans un cookie entre le navigateur et le serveur, nous vous recommandons d’utiliser SSL (Secure Sockets Layer) pour sécuriser la communication entre le navigateur client et le serveur Web. Pour plus d’informations, voir Considérations liées à la sécurité dans Étape 3 : déployer le composant WebPart personnalisé.
Vous pouvez télécharger le code complet pour l’exemple de composant WePart pour les résultats de la recherche fédérée personnalisée dans l’onglet Exemple de composant WebPart pour les résultats de la recherche fédérée (en anglais), sur la page de ressources Exemples de recherche du Kit de développement logiciel (SDK) Microsoft Office SharePoint Server 2007 (en anglais) de la Galerie de code MSDN (en anglais).
Procédures
Pour modifier le code dans le fichier PerUserAuthWebPart
Ajoutez les directives d’espace de noms suivantes dans la partie supérieure du code dans le fichier PerUserAuthWebPart.cs.
using System.Xml.Serialization; using System.Xml.XPath; using System.Net; using System.Web.Security; using Microsoft.Office.Server.Search.WebControls; using Microsoft.Office.Server.Search.Administration;
Dans la ligne de code suivante, remplacez WebControl par FederatedResultsWebPart et IPostBackEventHandler :
public class PerUserAuthWebPart : FederatedResultsWebPart, IPostBackEventHandler
Ajoutez la ligne de code suivante au-dessus de la déclaration de classe pour PerUserAuthWebPart.
[XmlRoot(Namespace = "CustomFederatedResultsSample")]
Ajoutez le code suivant sous la déclaration de classe.
private TextBox UsernameTextBox = new TextBox(); private TextBox PasswordTextBox = new TextBox(); private Button LogOnButton = new Button(); private Button LogOutButton = new Button(); private string Username = ""; private string Domain = ""; private string Password = ""; private ICredentials Creds; XPathNavigator Results; Table controlsTable; Label statusLabel = new Label(); TableRow LoginControlsRow;
Remplacez les méthodes OnLoad, OnPreRender et CreateChildControls en utilisant le code suivant.
protected override void OnLoad(EventArgs e) { try { this.ShowMessages = false; base.OnLoad(e); } catch (Exception ex) { string x = ex.Message.ToString(); } } protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); base.CreateChildControls(); } protected override void CreateChildControls() { this.CreateLogonControls(); }
Ajoutez le code suivant pour la méthode CreateLogonControls, qui crée et charge les contrôles de l’interface personnalisée pour demander les informations d’identification de l’utilisateur.
protected void CreateLogonControls() { controlsTable = new Table(); controlsTable.Width = Unit.Percentage(100); controlsTable.Attributes.Add("cellspacing", "1"); controlsTable.Attributes.Add("cellpadding", "1"); LoginControlsRow = new TableRow(); TableRow LogoutControlsRow = new TableRow(); TableCell cell = new TableCell(); this.UsernameTextBox = new TextBox(); this.UsernameTextBox.ID = "UserName"; UsernameTextBox.Visible = true; UsernameTextBox.EnableViewState = true; cell.Controls.Add(UsernameTextBox); LoginControlsRow.Controls.Add(cell); cell = new TableCell(); PasswordTextBox = new TextBox(); this.PasswordTextBox.ID = "Password"; PasswordTextBox.TextMode = TextBoxMode.Password; PasswordTextBox.Visible = true; PasswordTextBox.EnableViewState = true; cell.Controls.Add(PasswordTextBox); LoginControlsRow.Controls.Add(cell); cell = new TableCell(); this.LogOnButton = new Button(); LogOnButton.Text = "Logon"; LogOnButton.Visible = true; cell.Controls.Add(LogOnButton); LoginControlsRow.Controls.Add(cell); LoginControlsRow.Width = Unit.Percentage(100); cell = new TableCell(); statusLabel.Text = ctrl; cell.Controls.Add(statusLabel); TableRow statusRow = new TableRow(); statusRow.Cells.Add(cell); cell = new TableCell(); this.LogOutButton = new Button(); LogOutButton.Text = "Logout"; LogOutButton.Visible = true; cell.Controls.Add(LogOutButton); statusRow.Cells.Add(cell); controlsTable.Rows.Add(statusRow); controlsTable.Rows.Add(LoginControlsRow); this.Controls.Add(controlsTable); }
Remplacez la méthode ConfigureDataSourceProperties en utilisant le code suivant.
protected override void ConfigureDataSourceProperties() { base.ConfigureDataSourceProperties(); FederatedResultsDatasource fedrds = this.DataSource as FederatedResultsDatasource; string locName = ""; LocationConfiguration locationConfig = null; if (fedrds.Location != null) { locName = fedrds.Location; LocationConfigurationCollection locations = SearchContext.Current.LocationConfigurations; locations.TryGetLocationConfigurationByInternalName(locName, out locationConfig); } try { if (Page.Request.Cookies["Username"] != null) { Username = DecryptedCookieData(Page.Request.Cookies["Username"].Value); } if (Page.Request.Cookies["Domain"] != null) { Domain = DecryptedCookieData(Page.Request.Cookies["Domain"].Value); } if (Page.Request.Cookies["Password"] != null) { Password = DecryptedCookieData(Page.Request.Cookies["Password"].Value); } } catch (Exception e) { string exception = e.Message; } if (Page.IsPostBack) { if (GetPostBackControlText() == "Logout") { Username = ""; Password = ""; Domain = ""; } else if (GetPostBackControlText() == "Logon") { if (UsernameTextBox.Text.Contains(@"\")) { string[] domainUsername = UsernameTextBox.Text.Split('\\'); Domain = domainUsername[0]; Username = domainUsername[1]; } else { Username = UsernameTextBox.Text; } Password = PasswordTextBox.Text; } } Page.Response.Cookies["Username"].Value = EncryptedCookieData(Username,"Username"); Page.Response.Cookies["Password"].Value = EncryptedCookieData(Password, "Password"); Page.Response.Cookies["Domain"].Value = EncryptedCookieData(Domain, "Domain"); if (fedrds.Location != null) { Creds = new NetworkCredential(Username, Password, Domain); } if (fedrds.UserCredentials.ContainsKey(locName)) { fedrds.UserCredentials.Remove(locName); } fedrds.UserCredentials.Add(locName, Creds); }
Créez des méthodes pour chiffrer et déchiffrer les données de cookie en utilisant le code suivant.
private string EncryptedCookieData(string cookieValue,string cookieName) { string returnString = ""; FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, cookieName, DateTime.Now, DateTime.Now.AddMinutes(30), false, cookieValue, "/"); returnString = FormsAuthentication.Encrypt(ticket); return returnString; } private string DecryptedCookieData(string cookie) { string returnString = ""; FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie); returnString = ticket.UserData; return returnString; }
Ajoutez le code suivant pour la méthode GetPostBackControlText, qui retourne une chaîne indiquant si la publication a été déclenchée par un événement Clic sur un bouton Logon ou Logout, ou par aucun des deux.
private string GetPostBackControlText() { Control control = null; Control c = null; foreach (string controlName in Page.Request.Form) { c = Page.FindControl(controlName); if (c is System.Web.UI.WebControls.Button) { control = c; break; } } if (control != null) { return ((Button)(control)).Text; } else { return ""; } }
Remplacez la méthode GetXPathNavigator pour afficher ou masquer les contrôles de connexion/déconnexion basés sur le fait que des résultats ont été retournés ou non, à l’aide du code suivant.
protected override XPathNavigator GetXPathNavigator(string viewPath) { Results = base.GetXPathNavigator(viewPath); if (Results == null) /* Login failed, or no credentials were entered, so Login controls should be displayed. */ { LogOutButton.Visible = false; LoginControlsRow.Visible = true; } else /* Login succeeded, so hide login controls, and show Logout button. */ { LogOutButton.Visible = true; LoginControlsRow.Visible = false; } return Results; }
Modification du code pour prendre en charge l’authentification par formulaires basée sur des cookies
L’exemple de composant WebPart décrit dans cette procédure pas à pas ne fonctionne pas pour les emplacements fédérés qui sont configurés pour utiliser l’authentification par formulaires. Vous souhaiterez peut-être modifier l’exemple pour prendre en charge l’authentification par formulaires basée sur les cookies. Pour ce faire, modifiez le code de sorte qu’il effectue les opérations suivantes :
Récupère l’URL spécifiée pour l’emplacement fédéré.
Détermine l’URL de la page d’ouverture de session par formulaires pour l’emplacement fédéré.
Demande la page d’ouverture de session pour l’emplacement fédéré.
Affiche le formulaire d’ouverture de session dans l’interface utilisateur, afin que l’utilisateur puisse entrer ses informations d’identification.
Si l’utilisateur confirme que la tentative d’ouverture de session par formulaires a réussi, récupère les éléments d’entrée d’ouverture de session et les valeurs.
Passe les éléments d’entrée d’ouverture de session et les valeurs avec la méthode de demande de page d’ouverture de session et l’URL à l’emplacement fédéré à l’aide de l’objet FormsCredentials, comme illustré dans l’extrait de code suivant.
Creds = new FormsCredentials(credsLogonURL, credsLogonURL, credsLogonInput, credsSecureLogonInput, credsLogonMethod, cookies);
Notes
Ce code fonctionne uniquement si CookieCollection passé dans le paramètre des cookies du constructeur FormsCredentials ne contient aucun objet Cookie.
Stocke les éléments d’entrée d’ouverture de session basée sur des formulaires avec la méthode de demande de page d’ouverture de session et l’URL dans un cookie chiffré ou en utilisant un fournisseur de service d’authentification unique.
Important
Si vous passez les informations d’identification dans un cookie entre le navigateur et le serveur, nous vous recommandons d’utiliser SSL (Secure Sockets Layer) pour sécuriser la communication entre le navigateur client et le serveur Web. Pour plus d’informations, voir Considérations liées à la sécurité dans Étape 3 : déployer le composant WebPart personnalisé.
Étape suivante
Étape 3 : déployer le composant WebPart personnalisé
Voir aussi
Référence
FormsCredentials
FederatedResultsWebPart
FederatedResultsDatasource
FederatedResultsDatasourceView
SearchResultsBaseWebPart
SearchResultsBaseDatasource
SearchResultsBaseDatasourceView
Autres ressources
Étape 1 : configurer le projet pour le composant WebPart personnalisé
Création d'un composant WebPart personnalisé de recherche fédérée avec une interface utilisateur informations d'identification
Vue d'ensemble de la recherche fédérée