blog}

Creare un meccanismo di autentificazione Forms-Based per un’applicazione SharePoint Foundation utilizzando il Membership ed il Role Providers di ASP.NET SQL

Premessa doverosa: per raggiungere l’obiettivo del titolo di questo post ho impiegato più di 8 ore di lavoro leggendo e rileggendo documentazione tecnica Microsoft, blog tecnici e quanto altro. Spero che il mio post sia di aiuto a molti lettori; comunque lo sarà per me nei prossimi deployment. Il documento MSDN che prenderò come riferimento è il seguente http://msdn.microsoft.com/en-us/library/gg252020.aspx (che deve essere adattata per Sharepoint Foundation). Allo stesso modo suddividerò la trattazione per passi successivi. 

STEP 1: Preparazione del Database al fine di utilizzare il Membership ed il Role Provider ASP.NET per le applicazioni web

Eseguiamo il file aspnet_regsql.exe contenuto nella cartella C:\Windows\Microsoft.NET\Framework64\v2.0.50727. Verrà avviata una procedura guidata che consentirà facilmente di creare il database che verrà utilizzando dal Provider. Sarà sufficiente selezionare l’istanza del Server di Database (WIN-02F9XCJAEJX\SQLEXPRESS nel mio caso) ed assegnare il nome al database (aspnetdb_claim)

STEP 2: Aggiungere utenti e ruoli al Database del Provider dei Ruoli e dei Membri

Avviare Microsoft SQL Server Management Studio ed eseguire le seguenti query sul db aspnetdb_claim database:

declare @now datetime
set @now= GETDATE()
exec aspnet_Membership_CreateUser 'MyAppName','admin','pwadmin',
    '','admin1@contoso.com','','',1,@now,@now,0,0,null
EXEC aspnet_Roles_CreateRole 'MyAppName', 'Administrator'
EXEC aspnet_UsersInRoles_AddUsersToRoles 'MyAppName', 'admin', 'Administrator', 8
STEP 3: Creare un’applicazione di Sharepoint Foundation

 Seguire la seguente procedura

  1. Aprire SharePoint 2010 Central Administration
  2. In Application Management section, cliccare su Manage web applications.
  3. Sulla ribbon (striscia superiore della finestra) cliccare su New. Si creerà una nuova applicazione con dei valori default: assumiamo in questo esempio che la porta sia la numero 8676 e l’url pubblico sia http://WIN-02F9XCJAEJX:8676/ (WIN-02F9XCJAEJX è il nome del server dove state eseguendo il deployment)
  4. Nella finestra di dialogo, nella sezione Authentication, scegliere Claims Based Authentication.
  5. In Claims Authentication Types section, selezionare Enable Forms Based Authentication (FBA) e deselezionare tutte le altre opzioni (in particolare Enable Windows Authentication e Integrated Windows authentication)
  6. Nella casella di testo “ASP.NET membership provider name” immettere aspnetmembership, nel campo “ASP.NET role manager name” svrivere  aspnetrolemanager
  7. Nella sezione “Database Name and Authentication”, cambiare il nome del db da WSS_Content a WSS_Content_8676 ed assicurarsi che il database server sia WIN-02F9XCJAEJX\Sqlexpress, dove abbiamo creato il dabase dei ruoli e membri.
  8. Lasciare le altre opzioni invariate
STEP 4: Configurare il Membership ed il Role Provider per l’applicazione Sharepoint Foundation

Questo step prevede la modifica di:

  1. Central Administration
  2. Security Token Service
  3. FBA Web Application

E’ necessario innanzitutto identificare il web.config della SharePoint 2010 Central Administration: a tal proposito è possibile ad esempio servirsi di IIS Manager ed espolare il sito “SharePoint Central Administration v4”. Nel mio caso la directory di appoggio della Central Administration si trova in C:\inetpub\wwwroot\wss\VirtualDirectories\32388.Sostituire il web.config con web.config (46,21 kb). Di fatto sarebbe stato sufficiente inserire nel web.config la segunte stringa di connessione appena dopo </configSections>

<connectionStrings>
    <clear />
    <add name="AspNetSqlMembershipProvider" connectionString="data source=.\Sqlexpress;Integrated Security=SSPI;Initial Catalog=aspnetdb_claim"
      providerName="" />
    <add name="MyLocalSQLServer" connectionString="Initial Catalog=aspnetdb_claim;data source=.\Sqlexpress;Integrated Security=SSPI;" />
  </connectionStrings>
ed il seguente codicie
<roleManager enabled="true" cacheRolesInCookie="false" cookieName=".ASPXROLES"
      cookieTimeout="30" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true"
      cookieProtection="All" defaultProvider="AspNetWindowsTokenRoleProvider"
      createPersistentCookie="false" maxCachedResults="25">
      <providers>
        <clear />
        <add connectionStringName="AspNetSqlMembershipProvider" applicationName="/"
          name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        <add applicationName="/" name="AspNetWindowsTokenRoleProvider"
          type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        <add name="aspnetrolemanager"
             type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
             connectionStringName="MyLocalSQLServer"
             applicationName="MyAppName" />
      </providers>
    </roleManager>
    <membership defaultProvider="AspNetSqlMembershipProvider" userIsOnlineTimeWindow="15"
      hashAlgorithmType="">
      <providers>
        <clear />
        <add connectionStringName="AspNetSqlMembershipProvider" enablePasswordRetrieval="false"
          enablePasswordReset="true" requiresQuestionAndAnswer="true"
          passwordAttemptWindow="10" applicationName="/" requiresUniqueEmail="false"
          passwordFormat="Hashed" name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        <add name="aspnetmembership"
             connectionStringName="MyLocalSQLServer"
             applicationName="MyAppName"
             type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
      </providers>
    </membership>

nel <system.web>, andando a sostituire i tag <roleManager> e <membership> se già estenti.Sempre mediante IIS identificare SharePoint Web Services ed esplorare SecurityTokenServiceApplication. Nel nostro caso si verrebbe reindirizzati alal seguente cartella C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\WebServices\.Sostituire il web.config presente con web.config (6,73 kb), oppure aggiungere al web.config già presente il seguente codice appenda dopo <configuration>

<connectionStrings>
    <clear />
    <add name="AspNetSqlMembershipProvider" connectionString="data source=.\Sqlexpress;Integrated Security=SSPI;Initial Catalog=aspnetdb_claim"
      providerName="" />
    <add name="MyLocalSQLServer" connectionString="Initial Catalog=aspnetdb_claim;data source=.\Sqlexpress;Integrated Security=SSPI;" />
  </connectionStrings>

e la sezione seguente appena prima di </configuration>:

<system.web>
    <roleManager enabled="true" cacheRolesInCookie="false" cookieName=".ASPXROLES" cookieTimeout="30" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true" cookieProtection="All" createPersistentCookie="false" maxCachedResults="25">
      <providers>
        <add connectionStringName="AspNetSqlMembershipProvider" applicationName="/" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        <add name="aspnetrolemanager" 
             type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
             connectionStringName="MyLocalSQLServer"
             applicationName="MyAppName" />
      </providers>
    </roleManager>
    <membership userIsOnlineTimeWindow="15" hashAlgorithmType="">
      <providers>
        <add connectionStringName="AspNetSqlMembershipProvider" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" passwordAttemptWindow="10" applicationName="/" requiresUniqueEmail="false" passwordFormat="Hashed" name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
 	<add name="aspnetmembership"
             connectionStringName="MyLocalSQLServer"
             applicationName="MyAppName"
             type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
      </providers>
    </membership>
 </system.web>

Infine è necessario sostituire il web.config della nostra applicazione web allocata in C:\inetpub\wwwroot\wss\VirtualDirectories\8676 con web.config (48,19 kb) o in alternativa modificare il file di configurazione già presente aggiungendo:

<connectionStrings>
    <add name="MyLocalSQLServer" connectionString="data source=.\Sqlexpress;Integrated Security=SSPI;Initial Catalog=aspnetdb_claim" providerName="" />
  </connectionStrings>

subito dopo </configSections> e

<membership defaultProvider="i">
      <providers>
        <add name="i" type="Microsoft.SharePoint.Administration.Claims.SPClaimsAuthMembershipProvider, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
        <add name="aspnetmembership" connectionStringName="MyLocalSQLServer" applicationName="MyAppName" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
      </providers>
    </membership>
    <roleManager defaultProvider="c" enabled="true" cacheRolesInCookie="false">
      <providers>
        <add name="c" type="Microsoft.SharePoint.Administration.Claims.SPClaimsAuthRoleProvider, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
        <add name="aspnetrolemanager" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="MyLocalSQLServer" applicationName="MyAppName" />
      </providers>
    </roleManager>

appena prima di </system.web>, sostituendo nel caso in cui esistano i tag già presenti. 

STEP 5: Testare il modello di autentificazione

Utilizzando la Central Administration website, sotto Application Management cliccare su Create site collection.Nella casella a discesa Web Application selezionare la nostra applicazione, http://WIN-02F9XCJAEJX:8676/ e quindi assegnare un titolo al sito. Nella texbox User name scrivere admin, ovvero il nome dell’utente che abbiamo inserito nel DB e controllare l’esistenza dell’utente.Confermare la creazione del sito e nel browser digitare http://WIN-02F9XCJAEJX:8676/ . Se tutto funziona si viene reindirizzati ad una pagina di login dove si deve inserire lo user name admin e la password pwadmin.

STEP 6: Risolvere gli eventuali problemi

Il problema che io ho incontrato era legato alla non attivazione di Security Token Service Application . 

La risoluzione del problema è descritta nel seguente articolo http://support.microsoft.com/kb/2520344. In particolare ho dovuto assegnare al sito il livello di Trust Full.

ti è piaciuto l'articolo? condividi

sharing my ICT knowledge and expertise through the documentation of my experiences

Eros Sormani

Mi occupo di progettazione e sviluppo di soluzioni software e di creazione, implementazione e mantenimento di infrastrutture digitali

Altri Articoli del BLOG

Torna su