In SharePoint 2010 quando si attivano più provider di autenticazione in una zona, ad esempio quando serve un autenticazione windows e forms, bisogna usare claims. Questo cambia la modalità di login a SharePoint in quanto, per accedere la prima volta, viene presentata una pagina aspx con una combo che mostra i provider disponibili. Se si sceglie windows si viene immediatamente reindirizzati alla pagina richiesta. Scegliendo forms viene mostrato un form di login con la richiesta di utente e password.

Può capitare di avere la WebAplication estesa su due zone e voler fare in modo che in una zona (es. default) non venga mostrata la pagina di scelta ma venga eseguita subito l'autenticazione windows, mentre nella zona esterna (es. external) si venga rediretti subito al form di login. Questà seconda opzione è facilmente impostabile dalla centra amministation in fase di configurazione della zona (external), ma non esiste niente di nativo per il primo caso (windows autentication NTLM o Kerberos).

Per sopperire a questa limitazione può tornare utile questa pagina che non fa niente altro che eseguire un login automatico con le credenziali windows dell'utente corrente. Il risultato è che l'untente non si accorge della pagina di login e sembra di essere ritornati al comportamento di SharePoint 2007 con l'autenticazione integrata. Il vantaggio di questo approccio è che l'utente loggato, ha la possibilità di scegliere, in fase di assegnazione permessi o altro, gli utenti da entrambi i provider (windows e form).

File: WindowsAutoLogin.aspx
<%@ Assembly Name="SharePointWindowsAutoLogin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=fc0740a23b131380" %>
<%@ Page Language="C#" AutoEventWireup="true" Inherits="SharePointWindowsAutoLogin.AutoLogin"  %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Windows Auto Login</title>
</head>
<body>
    <form id="Form1" runat="server">
    </form>
</body>
</html>

File: WindowsAutoLogin.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Security;

using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.Utilities;

namespace SharePointWindowsAutoLogin
{
    public class AutoLogin : Page
    {
        protected override void OnLoad(EventArgs e)
        {
            if (((SPContext.Current != null) && (SPContext.Current.Site != null)) && (SPContext.Current.Site.WebApplication != null))
            {
                SPWebApplication application = SPContext.Current.Site.WebApplication;

                SPUrlZone zone = application.AlternateUrls[base.Request.Url].UrlZone;
                string components = base.Request.Url.GetComponents(UriComponents.Query, UriFormat.SafeUnescaped);

                SPIisSettings settings = application.IisSettings[zone];

                foreach (SPAuthenticationProvider provider in settings.ClaimsAuthenticationProviders)
                {
                    if (provider is SPWindowsAuthenticationProvider)
                    {
                        string str4 = provider.AuthenticationRedirectionUrl.ToString();
                        components = this.EnsureReturnUrl(components);
                        SPUtility.Redirect(str4, 0, this.Context, components);
                    }
                }
            }

            base.OnLoad(e);
        }

        // Methods
        private string EnsureReturnUrl(string queryString)
        {
            if (string.IsNullOrEmpty(queryString))
            {
                queryString = "?";
            }
            if (!queryString.Contains("ReturnUrl="))
            {
                if (!string.IsNullOrEmpty(queryString))
                {
                    queryString = queryString + "&";
                }
                queryString = queryString + "ReturnUrl=/";
            }
            return queryString;
        }
    }
}
Per utilizzarla:
  • mettere la pagina, ad esempio in ...14\Template\layouts\Sgart\WindowsAutoLogin.aspx
  • andare nella Central Administration
  • selezionare la WebApplication interessata
  • cliccare sul pulsante Authentication providers e scegliere la zona interessata
  • nella sezione Sign In Page URL selezionare Custom Sign In Page
  • inserire ~/_layouts/sgart/WindowsAutoLogin.aspx
  • salvare