10

Dec

Windows Azure WebRole: quando NetworkService non è sufficiente

Ciao a tutti

capita a volte di fare deploy di una applicazione web su Windows Azure, come nel mio caso di HomeFramework e ci si trova a chiedersi: come faccio ad impostare l’AppPool in automatico senza andare in DesktopRemoto su tutte le istanze del mio cloud, andando di fatto a vanificare ogni aspettativa cloud….

Fortunatamente la risposta è abbastanza semplice, ed è nell’assembly Microsoft.Web.Administration che giace sepolta e nascosta in C:\Windows\System32\inetsrv\Microsoft.Web.Administration.dll

 

Una volta aggiunto il semplice riferimento al nostro WebRole, è sufficiente andare in WebRole.cs/vb che automaticamente l’SDK di Windows Azure aggiunge ai nostri WebRole, e scrivere qualcosa come questo:

 

public override bool OnStart()
{
    // To enable the AzureLocalStorageTraceListner, uncomment relevent section in the web.config 
    DiagnosticMonitorConfiguration diagnosticConfig = DiagnosticMonitor.GetDefaultInitialConfiguration();
    diagnosticConfig.Directories.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
    diagnosticConfig.Directories.DataSources.Add(AzureLocalStorageTraceListener.GetLogDirectory());

    try
    {
        using (ServerManager serverManager = new ServerManager())
        {
            //leggo il nome del mio AppPool
            string appPoolName = serverManager.Sites[RoleEnvironment.CurrentRoleInstance.Id + "_Web"].Applications.First().ApplicationPoolName;
            Log.Verbose("Found AppPool {0}", appPoolName);
            //prendo l'AppPool per poterci fare modifiche
            var appPool = serverManager.ApplicationPools[appPoolName];
            //cambio le credenziali (ovviamente posso anche dargliene di specifiche, ma poi dovrei gestire un dominio cloud...
            appPool.ProcessModel.IdentityType = ProcessModelIdentityType.LocalSystem;
            //salvo
            serverManager.CommitChanges();
            Log.Information("Set AppPool {0} identity at {1}", appPoolName, appPool.ProcessModel.IdentityType);
        }
    }
    catch (Exception ex)
    {
        Log.Error(ex, "Unable to configure AppPool!");
    }

    return base.OnStart();
}

 

questo codice farà si che ad ogni deploy di Windows Azure, automaticamente sarà eseguita questa configurazione, così, quando l’applicazione sarà tirata su da IIS, automaticamente ci troveremo con le credenziali aumentate a (in questo esempio) LocalSystem

ovviamente se ne sconsiglia l’uso se non obbligatorio come nel mio caso ove avevo da creare endpoint dinamici che senza diritti non avrei potuto tirare su in HTTP…..

 

per via della sicurezza di Windows Azure, questo stessso codice non avrebbe i diritti per salvare le modifiche su IIS a meno di andare nel ServiceDefinition.csdef e aggiungere questa riga nel nodo del nostro WebRole:

//cercare il vostro nodo

//aggiungere questa riga

 

 

a presto

by Antonio Esposito on 12/10/2011