Hosting Aruba + MembershipProvider di ASP.NET 2.0 : si può!
Mi è capitato nelle scorse settimane di dover pubblicare due applicazioni ASP.NET 2.0 in cui erano utilizzati i providers Membership, Role e Profile.
Quando ho saputo che le applicazioni dovevano girare su Aruba, per prima cosa ho pensato di scappare
(avevo letto qualcosa a proposito dei problemi relativi all'utilizzo dei provider su Aruba) ma poi, armato di santa pazienza mi sono messo al lavoro
.
Il problema principale è dovuto al fatto che, l’implementazione di Microsoft dei tre provider ha, sia nelle classi che nel codice SQL, “embedded” il riferimento all’utente dbo, che non è l’utente che Aruba fornisce per accedere al server MS SQL e quindi qualsiasi storedprocedure, o metodo .net delle classi utilizza dbo.nomemetodo.
Ecco quindi i passi necessari per ovviare alla cosa:
- Scaricare i sorgenti dei tre provider (http://download.microsoft.com/download/a/b/3/ab3c284b-dc9a-473d-b7e3-33bacfcc8e98/ProviderToolkitSamples.msi)
- Rimuovere dai sorgenti tutti i riferimenti all’utente dbo
- Compilare i sorgenti in modo da avere un nuovo assembly ProviderToolkitSampleProviders.dll
- Copiare l’assembly nella cartella Bin della WebApp
- Nel web.config nella riga corrispondente alla definizione di ognuno dei tre provider sostituire il contenuto dell’attributo type con il seguente : “Microsoft.Samples.<Nome_della_classe_del_provider>, ProviderToolkitSampleProviders”
- Esportare gli script di viste e stored procedure, dal vostro db in locale, relative ai tre provider e rimuovete anche in questi script ogni riferimento all’utente dbo.
- Sostituire con questi nuovi script le viste e le stored procedure presenti sull’hosting di Aruba
- Copiare, infine, i record contenuti nella tabella aspnet_SchemaVersions dal vostro db a quello su Aruba
Ecco un esempio di modifica del file web.config:
<membership defaultProvider="MioMembershipProvider">
<providers>
<add connectionStringName="db" enablePasswordRetrieval="false" enablePasswordReset="false" requiresUniqueEmail="false" requiresQuestionAndAnswer="false" minRequiredPasswordLength="1" minRequiredNonalphanumericCharacters="0" applicationName="MiaApplicazione" passwordFormat="Hashed" name="MioMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</membership>
Che diventa:
<membership defaultProvider="MioMembershipProvider">
<providers>
<add connectionStringName="db" enablePasswordRetrieval="false" enablePasswordReset="false" requiresUniqueEmail="false" requiresQuestionAndAnswer="false" minRequiredPasswordLength="1" minRequiredNonalphanumericCharacters="0" applicationName="MiaApplicazione" passwordFormat="Hashed" name="MioMembershipProvider" type="Microsoft.Samples.SqlMembershipProvider, ProviderToolkitSampleProviders"/>
</providers>
</membership>
Tutto sembra funzionare alla perfezione quindi....Mission Completed! 