Contournement de la page de sélection des fournisseurs d’authentication multiples dans SharePoint 2010

Article d’origine publié le dimanche 1er mai 2011

REMARQUE :   Encore bravo aux responsables de ce site. Cette dernière version conserve encore MOINS de mise en forme de Word et de Visual Studio qu’auparavant ! Je ne pensais pas qu’il était possible de rendre ce site est encore pire qu’il n’était, et je dois avouer que vous avez largement dépassé mes attentes à cet égard. Félicitations ! Je pense qu’il ne me reste plus qu’à abandonner Word, Excel et PowerPoint pour me contenter du Bloc-notes, à quoi sert la mise en forme de toute manière ?

J’ai récemment dû contourner la page de sélection des fournisseurs qui s’affiche lorsque vous activez les fournisseurs d’authentication multiples sur une zone dans SharePoint 2010. Mon scénario était relativement simple, mais la méthodologie peut être étendue pour prendre en charge des scénarios plus complexes. Dans mon cas, j’utilisais l’authentification Windows et l’authentification basée sur des formulaires (FBA) activées sur une zone. Cependant, j’ai toujours préféré conseiller aux utilisateurs d’utiliser FBA pour ce scénario particulier.

L’opération s’est avérée relativement simple :

  1. FAITES UNE COPIE DE SAUVEGARDE de default.aspx dans le dossier C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\IDENTITYMODEL\LOGIN.
  2. Ouvrez Visual Studio et créez un nouveau projet de bibliothèque de classes Windows.
  3. Ajoutez des références à System.Web, Microsoft.SharePoint.dll et Microsoft.SharePoint.IdentityModel.dll. Malheureusement, l’assembly de modèle d’identité se trouve uniquement dans le GAC, j’ai donc dû en obtenir une copie et la placer dans la racine de mon lecteur pour ajouter ma référence. Pour consulter une suggestion de la marche à suivre pour le trouver et le copier, consultez mon article à ce sujet :  https://blogs.msdn.com/b/sharepoint_fr/archive/2010/11/24/201-criture-d-une-page-de-connexion-personnalis-233-e-dans-le-cadre-d-une-authentification-par-formulaire-pour-sharepoint-160-2010-partie-160-1.aspx.
  4. Attribuez un nom fort à l’assembly car il va dans le GAC.
  5. Ajoutez une nouvelle page ASPX à votre projet. Honnêtement, il me semble plus facile de simplement copier une page d’un projet d’application Web ASP.NET existant ; de cette manière, nous pouvons copier simultanément les fichiers .aspx, .aspx.cs, et .aspx. et designer .cs. Rappelons que dans ce cas nous avons besoin d’un fichier nommé « default.aspx » et il est plus simple qu’aucun code n’y soit écrit et que la page comporte un minimum de balises.
  6. Dans le code sous-jacent (fichier .aspx.cs), changez l’espace de noms en celui de votre projet actuel.
  7. Changez la classe pour qu’elle hérite de Microsoft.SharePoint.IdentityModel.Pages.MultiLogonPage.
  8. Remplacez l’événement OnLoad. Lorsque des utilisateurs accèdent à un site où plusieurs fournisseurs d’authentification sont activés, ils sont d’abord envoyés à la page /_login/default.aspx page (celle décrite à l’étape 1 ci-dessus). Sur cette page, un utilisateur choisit le fournisseur d’authentification à utiliser, puis il est redirigé vers la page appropriée pour s’authentifier. Dans ce scénario, j’ai déjà indiqué ma préférence pour l’authentification FBA, et j’ai donc toujours souhaité les envoyer à /_forms/default.aspx. Si vous effectuez une connexion normale, vous verrez que vous êtes redirigé vers /_login/default.aspx, vous faites votre sélection, puis vous revenez à /_login/default.aspx, et êtes alors redirigé vers la page de connexion appropriée. Dans ce cas, je souhaitais donc simplement vérifier si ma page de connexion est publiée. Si elle ne l’est pas je sais qu’aucune sélection n’a encore été effectuée pour le fournisseur d’authentication. J’énumère donc simplement toutes les valeurs de chaînes de requête, puis les ajoute à /_forms/default.aspx et y redirige l’utilisateur. Voici comment se présente l’extrait de code concerné :

protection de OnLoad(EventArgs e)

{

   base.OnLoad(e);

 

   try

   {

       //si ceci n’est pas publié, l’utilisateur n’a pas choisi

       //le fournisseur d’authentification à utiliser

       //dans ce cas nous souhaitons toujours conseiller la connexion par formulaire à cette personne

       if (!this.IsPostBack)

       {

          //prendre tous les paramètres de chaîne de requête

          System.Text.StringBuilder qp = new System.Text.StringBuilder(2048);

 

          foreach (string key in this.Request.QueryString.Keys)

          {

             qp.Append(key + "=" + this.Request.QueryString[key] + "&");

          }

 

          //rediriger vers la page de connexion par formulaire

          this.Response.Redirect("/_forms/default.aspx?" + qp.ToString());

       }

   }

   catch (Exception ex)

   {

       Debug.WriteLine(ex.Message);

   }

}

  1. Compilez maintenant l’application afin d’obtenir le nom fort et de l’ajouter au marquage pour default.aspx.
  2. Collez ce qui suit dans default.aspx, vous devrez simplement changer la classe dont la page hérite (mise en surbrillance ci-dessous ) ; notez que j’ai simplement copié à partir de /_login/default.aspx et remplacé la valeur Inherits par mes informations de classe personnalisées :

<%@ Page Language="C#" CodeBehind="Default.aspx.cs" Inherits="MultiAuthLoginPage._Default,MultiAuthLoginPage, Version=1.0.0.0, Culture=neutral, PublicKeyToken=907bf41ebba93579" MasterPageFile="~/_layouts/simple.master" %>

<%@ Assembly Name="Microsoft.SharePoint.IdentityModel, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<%@ Register Tagprefix="SharepointIdentity" Namespace="Microsoft.SharePoint.IdentityModel" Assembly="Microsoft.SharePoint.IdentityModel, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<%@ Assembly Name="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"%>

<%@ Import Namespace="Microsoft.SharePoint.WebControls" %>

<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<%@ Import Namespace="Microsoft.SharePoint" %>

<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<asp:Content ID="Content1" ContentPlaceHolderId="PlaceHolderPageTitle" runat="server">

                <SharePoint:EncodedLiteral runat="server"  EncodeMethod="HtmlEncode" Id="ClaimsLogonPageTitle" />

</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderId="PlaceHolderPageTitleInTitleArea" runat="server">

                <SharePoint:EncodedLiteral runat="server"  EncodeMethod="HtmlEncode" Id="ClaimsLogonPageTitleInTitleArea" />

</asp:Content>

<asp:Content ID="Content3" ContentPlaceHolderId="PlaceHolderSiteName" runat="server"/>

<asp:Content ID="Content4" ContentPlaceHolderId="PlaceHolderMain" runat="server">

<SharePoint:EncodedLiteral runat="server"  EncodeMethod="HtmlEncode" Id="ClaimsLogonPageMessage" />

<br />

<br />

<SharepointIdentity:LogonSelector ID="ClaimsLogonSelector" runat="server" />

</asp:Content> 

  1. Enregistrez l’assembly dans le GAC.
  2. Copiez la nouvelle page default.aspx personnalisée dans le dossier C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\IDENTITYMODEL\LOGIN.  DE NOUVEAU, FAITES AU PRÉALABLE UNE COPIE DE L’ORIGINAL !
  3. Effectuez les étapes 1, 11 et 12 sur votre serveur web frontal de votre batterie de serveurs.

Voilà c’est fait. J’ai testé cette procédure avec une connexion d’utilisateur standard, ainsi que pour l’ouverture de documents directement à partir de clients Microsoft Office 2010. Un point mérite d’être signalé :  ceci change le comportement de TOUTES les applications Web dans votre batterie de serveurs Ce n’est donc qu’un simple exemple. Cependant, vous pouvez facilement vérifier le nom d’hôte de la demande (correspondant à votre application Web) et effectuer d’autres décisions d’authentification en fonction de l’application Web concernée ou même de la collection de sites impliquée. Vous pouvez évidemment prendre d’autres décisions en fonction de vos informations sur l’utilisateur actuel. Les classes HttpRequest.Context.Current, Page.Request et Page.Response peuvent vous fournir beaucoup d’informations à cet égard.

 

Ce billet de blog a été traduit de l’anglais. La version d’origine se trouve à la page Bypassing the Multi Authentication Provider Selection Page in SharePoint 2010