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.

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

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 : </td>
<td><asp:TextBox ID="txbLoginOrEmail" runat="server" Width="150px" TextMode="SingleLine" /></td>
</tr>
<tr>
<td>Password : </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.

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 :