Publié samedi 18 septembre 2010 17:19 par Arnault Nouvel

SharePoint 2010 : Développer une web part d’authentification pour une page d’accueil

Nous avons vu dans un précédent billet comment configurer l’authentification par formulaire dans SharePoint 2010. Il est possible de développer son propre formulaire d’authentification afin d’en modifier le design et le comportement. Chun Liu propose un tutorial à cet effet : http://blogs.msdn.com/b/chunliu/archive/2010/08/21/creating-a-custom-login-page-for-fba-in-sharepoint-2010.aspx.

Je m’en suis inspiré pour développer une web part de login qui permet de s’authentifier en passant soit son login, soit son email. Mon autre objectif était de proposer l’authentification sur la page d’accueil du site, qui devait donc être en authentification anonyme. Ce billet détaille les étapes nécessaires pour parvenir à ce résultat.

Paramétrage de l’accès anonyme

Dans l’administration centrale : “Manage web applications”, sélectionner l’application web cible, cliquer dans le ruban sur “Authentication Providers”, sélectionner la zone cible, cocher “Enable Anonymous Access” et valider.

image

Dans la collection de sites : “Site Actions”, “Site Settings”, “Site permissions”, cliquer sur “Anonymous Access” dans le ruban, cocher “Entire Web Site” :

image

A ce stade, notre page d’accueil est accessible en authentification anonyme. Voyons maintenant comment développer une web part de login.

Développement de la web part

Avec Visual Studio 2010, créer un projet de type “Farm Solution”.

Pour manipuler les classes nécessaires à l’authentification en mode Claims, il est nécessaire d’ajouter 3 références au projet :

  • System.IdentityModel.dll (répertoire C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0)
  • Microsoft.IdentityModel.dll (répertoire C:\Program Files\Reference Assemblies\Microsoft\Windows Identity Foundation\v3.5)
  • Microsoft.SharePoint.IdentityModel.dll (à récupérer par ligne de commande dans C:\Windows\assembly\GAC_MSIL\System.IdentityModel\3.0.0.0__b77a5c561934e089)

Ajouter ensuite au projet une Visual Web Part

Code du fichier .ascx :

<table>

    <tr>

        <td>Login or email :&nbsp;</td>

        <td><asp:TextBox ID="txbLoginOrEmail" runat="server" Width="150px" TextMode="SingleLine" /></td>

    </tr>

    <tr>

        <td>Password :&nbsp;</td>

        <td><asp:TextBox ID="txbPassword" runat="server" Width="150px" TextMode="Password" /></td>

    </tr>

    <tr>

        <td colspan="2" align="right">

            <asp:Button ID="btnLogin" runat="server" Text="Login" OnClick="btnLogin_Click" />

        </td>

    </tr>

</table>

<asp:Label ID="lblError" runat="server" ForeColor="Red" EnableViewState="false" />

Code du fichier .ascx.cs :

    public partial class CustomAuthenticationWebPartUserControl : UserControl

    {

 

        //Validates an email adress

        private static Regex REGEX_EMAIL = new Regex(@"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", RegexOptions.Compiled | RegexOptions.IgnoreCase);

 

        protected void btnLogin_Click(object sender, EventArgs e)

        {

 

            //Retrieves a security token from supplied credentials

            SecurityToken token = GetSecurityTokenFromUserInput();

 

            if (token != null)

            {

 

                //Authenticates the user using the token

                SPFederationAuthenticationModule.Current.SetPrincipalAndWriteSessionToken(token);

 

                //Redirects user to current page or to previous page if there is a Source parameter in the query string

                //(Source parameter is set by SharePoint when redirecting to webapp's login page)

                SPUtility.Redirect(HttpContext.Current.Request.Url.ToString(), SPRedirectFlags.UseSource, HttpContext.Current);

               

            }

            else

                lblError.Text = "Invalid Credentials";

 

        }

 

       

        private SecurityToken GetSecurityTokenFromUserInput()

        {

           

            //Retrieves the SPFormsAuthenticationProvider associated to the current web application zone

            SPWebApplication webApp = SPWebApplication.Lookup(HttpContext.Current.Request.Url);

            SPIisSettings settings = webApp.IisSettings[SPContext.Current.Site.Zone];

            SPFormsAuthenticationProvider authProvider = settings.FormsClaimsAuthenticationProvider;

 

            //User input

            String login = txbLoginOrEmail.Text.Trim();

            String password = txbPassword.Text.Trim();

 

            //If the login input is an email, retrieves associated login using the membership provider

            if (REGEX_EMAIL.Match(login).Success)

            {

                MembershipProvider provider = Membership.Providers[authProvider.MembershipProvider];

                login = provider.GetUserNameByEmail(login);

            }

 

            //Returns the security token

            return SPSecurityContext.SecurityTokenForFormsAuthentication(HttpContext.Current.Request.Url, authProvider.MembershipProvider, authProvider.RoleProvider, login, password);

 

        }

 

    }

 

On notera qu’avec le claims authentication mode, on ne peut plus utiliser FormsAuthentication.Authenticate(login, password) comme on le faisait dans SharePoint 2007.

Après un Clic-droit + Deploy sur le projet, on peut positionner la web part sur la page d’accueil du site.

image

Cet exemple peut être téléchargé ici : SPCustomAuthenticationWebPart.zip

Custom Sign In Page

Lorsqu’un utilisateur non authentifié tente d’accéder à une ressource sécurisée, il est redirigé vers la page d’authentification dont l’url se paramètre au niveau web application. J’ai essayé de paramétrer la “Custom Sign In Page” sur l’url de la page d’accueil de mon site. Cependant, cela conduit à certains effets de bord désagréables. Par exemple, lorsqu’un utilisateur déjà authentifié accède à l’url de la “Custom Sign In Page” (la page d’accueil donc), SharePoint lève une erreur de sécurité.

En conjonction de d’une web part de login, je recommande donc de mettre en place un formulaire d’authentification personnalisé comme détaillé dans l’article de Chun Liu.

 

Arnault Nouvel – Winwise

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Classé sous , ,

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01