Freigeben über


Ignorare la pagina di selezione di più provider di autenticazione in SharePoint 2010

Articolo originale pubblicato domenica 1° maggio 2011

NOTA RAPIDA:   Complimenti al fantastico team che si occupa della gestione di questo sito. Quest'ultima versione mantiene una quantità addirittura INFERIORE di caratteristiche di formattazione di Word e Visual Studio rispetto a quella precedente. Non credevo fosse possibile rendere il sito peggiore di quanto già fosse, ma le mie aspettative a questo proposito sono state ampiamente superate. Congratulazioni Spero di seguire presto l'esempio, abbandonando Word, Excel e PowerPoint a favore del Blocco note, tanto a che serve la formattazione?

Di recente ho avuto l'esigenza di ignorare la pagina di selezione dei provider, che viene visualizzata quando si abilitano più provider di autenticazione in una singola area di SharePoint 2010. Lo scenario in questione era abbastanza semplice, tuttavia la metodologia può essere estesa per supportare scenari molto più complessi. Nel caso specifico, in una stessa area erano abilitate l'autenticazione di Windows e l'autenticazione basata su moduli. Per questo particolare scenario desideravo tuttavia reindirizzare gli utenti in modo che venisse sempre utilizzata l'autenticazione basata su moduli.

Eseguendo la procedura riportata di seguito è stato abbastanza semplice raggiungere questo obiettivo:

  1. CREARE UNA COPIA DI BACKUP di default.aspx nella cartella C:\Programmi\File comuni\Microsoft Shared\Web Server Extensions\14\TEMPLATE\IDENTITYMODEL\LOGIN.
  2. Aprire Visual Studio e creare un  nuovo progetto per una libreria di classi Windows.
  3. Aggiungere riferimenti a System.Web, Microsoft.SharePoint.dll e Microsoft.SharePoint.IdentityModel.dll. Purtroppo l'assembly di modelli di identità è disponibile solo nella GAC, quindi ho dovuto crearne una copia e inserirla nella directory radice della mia unità e aggiungervi un riferimento. Per suggerimenti su come individuare tale assembly ed eseguirne una copia, è possibile fare riferimento al mio post in cui è descritta questa operazione:  https://blogs.msdn.com/b/sharepoint_it/archive/2010/11/24/scrittura-di-una-pagina-di-accesso-personalizzata-con-autenticazione-basata-su-moduli-per-sharepoint-2010-parte-1.aspx.  
  4. Assegnare un nome complesso all'assembly in quanto verrà inserito nella GAC.
  5. Aggiungere una nuova pagina con estensione ASPX al progetto. Ritengo che il modo più semplice per eseguire questa operazione sia di copiare semplicemente una pagina da un progetto di applicazione Web ASP.NET esistente, in modo da copiare contemporaneamente i file aspx, aspx.cs e aspx.designer.cs. Tenere presente che in questo caso è necessario un file denominato “default.aspx” e sarà più facile se non contiene ancora codice e la pagina include una quantità minima di markup.
  6. Nel code-behind (file con estensione aspx.cs) modificare lo spazio dei nomi in modo che corrisponda a quello del progetto corrente.
  7. Modificare la classe affinché erediti da Microsoft.SharePoint.IdentityModel.Pages.MultiLogonPage.
  8. Eseguire l'override dell'evento OnLoad. Quando gli utenti visitano un sito in cui sono abilitati più provider di autenticazione, vengono innanzitutto indirizzati alla pagina /_login/default.aspx, che ho descritto al punto 1. In tale pagina un utente seleziona il provider di autenticazione da utilizzare, quindi viene reindirizzato alla pagina corretta per l'autenticazione. In questo scenario, come ho precisato, desidero che gli utenti utilizzino sempre l'autenticazione basata su moduli, quindi farò in modo che vengano sempre indirizzati a /_forms/default.aspx. Se si esamina un normale account di accesso istruzione per istruzione, si osserverà che dopo essere stato reindirizzato a /_login/default.aspx, avere eseguito la selezione e essere tornato a /_login/default.aspx, l'utente viene quindi reindirizzato alla pagina di accesso corretta. In questo caso, ho semplicemente controllato se veniva eseguito il postback della mia pagina di accesso. In caso contrario, significherebbe che non è ancora stato selezionato il provider di autenticazione. Mi limito quindi a enumerare tutti i valori delle stringhe di query e ad aggiungerli a /_forms/default.aspx, dove l'utente verrà reindirizzato. Di seguito è riportato l'intero frammento di codice:

protected override void OnLoad(EventArgs e)

{

   base.OnLoad(e);

 

   try

   {

       //if this isn't a postback, then the user hasn't selected which

       //auth provider they want to use

       //in this case we want to always refer the person to forms login

       if (!this.IsPostBack)

       {

          //grab all the query string parameters

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

 

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

          {

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

          }

 

          //redirect to the forms login page

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

       }

   }

   catch (Exception ex)

   {

       Debug.WriteLine(ex.Message);

   }

}

  1. A questo punto, procedere alla compilazione dell'applicazione in modo da ottenere il nome complesso e aggiungerlo al markup di default.aspx.
  2. Incollare il codice seguente in default.aspx. Sarà sufficiente modificare la classe da cui eredita la pagina (evidenziata di seguito), tenendo presente che l'ho semplicemente copiata da /_login/default.aspx e ho sostituito il valore Inherits con i dati della mia classe personalizzata:

<%@ 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. Registrare l'assembly nella GAC.
  2. Copiare la nuova pagina default.aspx personalizzata nella cartella C:\Programmi\File comuni\Microsoft Shared\Web Server Extensions\14\TEMPLATE\IDENTITYMODEL\LOGIN. PRIMA DI EFFETTUARE QUESTA OPERAZIONE, ESEGUIRE DI NUOVO UNA COPIA DI BACKUP DELL'ORIGINALE.
  3. Eseguire i passaggi 1, 11 e 12 in tutti i front-end Web della farm.

Tutto qui. Ho testato questa procedura sia con un account di accesso utente standard sia aprendo i documenti direttamente dai client di Microsoft Office 2010. Un altro aspetto che vale la pena sottolineare è che viene modificato il comportamento di TUTTE le applicazioni Web della farm. Ecco perché si tratta di un esempio semplice. È tuttavia possibile osservare semplicemente il nome host della richiesta, che viene mappata all'applicazione Web, e prendere decisioni diverse in merito all'autenticazione in base all'applicazione Web a cui viene effettuato l'accesso o in base alla raccolta siti. Naturalmente è possibile prendere altre decisioni, a seconda delle informazioni disponibili sull'utente corrente. Le classi HttpRequest.Context.Current, Page.Request e Page.Response possono fornire molte informazioni utili ai fini di questi tipi di decisioni.

 

Questo è un post di blog localizzato. L'articolo originale è disponibile in Bypassing the Multi Authentication Provider Selection Page in SharePoint 2010