Al momento sei offline in attesa che la connessione Internet venga ristabilita

Il tuo browser non è supportato

Devi aggiornare il browser per usare il sito.

Esegui l'aggiornamento all'ultima versione di Internet Explorer

Terminazione SSL e ASP.NET

Dichiarazione di non responsabilità per articoli della Microsoft Knowledge Base su prodotti non più supportati
Questo articolo è stato scritto sui prodotti per cui Microsoft non offre più supporto. L’articolo, quindi, viene offerto ‘così come è’ e non verrà più aggiornato.
Articolo di ASP.NET Support Voice

Terminazione SSL e ASP.NET

Per personalizzare questo articolo in base alle proprie esigenze, gli utenti sono invitati a inviare le proprie idee sugli argomenti a cui sono interessati e sui problemi di cui desiderano trovare la soluzione nei prossimi articoli della Knowledge Base e negli articoli di Support Voice. È possibile inviare idee, commenti e suggerimenti tramite il modulo Ask For It. Un collegamento al modulo è disponibile anche alla fine di questo articolo.
Benvenuti all'articolo di ASP.NET Support Voice. Mi chiamo Jerry Orman. Ho lavorato con Microsoft per più di cinque anni dedicandomi in particolare alle tecnologie Web, come i prodotti e le tecnologie Microsoft FrontPage e Microsoft SharePoint. Durante l'ultimo anno ho lavorato a Microsoft ASP.NET come tecnico del supporto. Questo mese, parlerò della terminazione SSL e di ASP.NET. Voglio in particolare concentrarmi sui problemi derivanti da una configurazione del server. Prenderò ora in esame la terminazione SSL e alcuni effetti collaterali di questa configurazione sull'applicazione in uso.

La terminazione SSL è una configurazione in cui il server Web che esegue il codice invia e riceve il traffico su HTTP e tra il server Web e i client è presente un dispositivo che crittografa e decrittografa i dati. In questa configurazione, i client inviano e ricevono il traffico HTTPS. La configurazione della terminazione SSL è simile a quella riportata di seguito:
Client <— HTTPS —>dispositivo SSL <— HTTP —> server Web
Illustrerò ora due problematiche che si verificano in Microsoft ASP.NET 2.0 con questa configurazione e alcuni modi per risolvere il problema.

Problema 1

Quando si posiziona il puntatore del mouse su una voce di menu nel controllo Menu di ASP.NET 2.0, viene visualizzato il seguente messaggio di errore:
La pagina contiene oggetti protetti e non protetti. Visualizzare gli oggetti non protetti?
Si presuppone che l'applicazione sia protetta, che sia in uso il protocollo SSL e che non siano stati aggiunti controlli che eseguono il rendering di un percorso assoluto di un indirizzo HTTP. Perché allora viene visualizzato questo messaggio?

Il problema è dovuto al fatto che il controllo Menu crea uno script Java che utilizza un oggetto iFrame per compilare il menu a comparsa. È necessario assegnare al frame un URL iniziale. Per evitare un round trip non necessario al server per gli scenari non SSL, lo script utilizza about:blank per l'URL. Tuttavia, il browser lo considera un indirizzo non sicuro e pertanto viene visualizzato l'errore precedente. Per ulteriori informazioni su questo problema in relazione a Microsoft Windows SharePoint Services, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito:
837850 Visualizzazione del messaggio "La pagina contiene oggetti protetti e non protetti" quando si fa clic su Visualizzazione Esplora risorse in una raccolta documenti in Windows SharePoint Services o in SharePoint Team Services da Microsoft
Ho fatto volutamente riferimento agli scenari non SSL perché, se il traffico HTTPS fosse ricevuto dal server Web invece che dal dispositivo SSL, lo script Java creato dal controllo Menu aggiungerebbe una riga di codice per impostare l'origine dell'oggetto iFrame su un indirizzo HTTPS di una pagina sul server. In questo modo viene iniziata un'altra richiesta, ma si evita il messaggio di errore. Se si esegue la distribuzione in questo tipo di ambiente, è possibile imporre l'aggiunta dello script Java per evitare il messaggio di errore aggiungendo questo codice alla pagina contenente il controllo Menu.
 <script runat="server">   protected override void Render(HtmlTextWriter writer)    {        Page.ClientScript.RegisterStartupScript(typeof(Page), "MenuHttpsWorkaround",         Menu1.ClientID + "_Data.iframeUrl='https://myserver/someblankpage.htm';", true);        base.Render(writer);   }</script> 
L'ideale sarebbe avere il menu in una classe MasterPage o in una classe UserControl per poter aggiungere questo codice una sola volta.

Problema 2

È possibile che, quando l'attributo requireSSL dell'elemento <forms> è impostato su true, il server risponda con reindirizzamenti ripetuti alla pagina di accesso FormsAuthentication. Questo problema è causato da una modifica nel modo in cui il metodo FormsAuthenticationModule gestisce l'attributo requireSSL. Se si imposta l'attributo requireSSL su true, il metodo FormsAuthenticationModule crea un cookie con l'attributo secure impostato. In .NET Framework 1.1 si verifica lo stesso comportamento. Quando si utilizza l'attributo secure, il client passerà il cookie solo al server se il client utilizza SSL. È perfetto, dal momento che il client sta effettivamente utilizzando SSL. Si supponga di avere una pagina SecurePage.aspx a cui gli utenti anonimi non possono accedere. Con il protocollo SSL e l'attributo requireSSL, in una richiesta iniziale a SecurePage.aspx si verrà a creare il traffico seguente:
—>Il client esegue una richiesta GET per SecurePage.aspx.

<—Il server risponde con HTTP 302 (reindirizzamento) alla pagina di accesso.

—>Il client esegue una richiesta GET per Login.aspx.

<—Il server risponde con 200 OK. Viene eseguito il rendering della pagina di accesso al client.

—>Il client esegue una richiesta POST a Login.aspx.

<—Il server risponde con 302 (reindirizzamento) a SecurePage.aspx. L'intestazione Set Cookie viene inviata al client con l'attributo secure.

—>Il client esegue una richiesta GET a SecurePage.aspx. Il cookie viene passato dal momento che il client sta utilizzando SSL.

<—Il server risponde con 302 (reindirizzamento) alla pagina di accesso.

Nell'ultima richiesta il reindirizzamento viene eseguito a causa di una modifica nella classe FormsAuthenticationModule. In ASP.NET 2.0 è stata aggiunta un'ulteriore verifica per determinare se l'utente sta passando un cookie sicuro su una richiesta non SSL. ASP.NET 2.0 restituisce la classe FormsAuthenticationTicket se la proprietà FormsAuthentication.RequireSSL è impostata su false o se l'attributo Request.IsSecure è impostato su true.
  • La proprietà FormsAuthentication.RequireSSL è impostata su false se l'attributo requireSSL è impostato su false nel file di configurazione.
  • L'attributo Request.IsSecure è impostato su true se il server Web riceve il traffico SSL.
Poiché, in questo scenario, il server Web non riceve il traffico SSL e l'attributo requireSSL è impostato su true, entrambe le verifiche restituiscono false. Di conseguenza, la classe FormsAuthenticationTicket non viene restituita e il cookie viene rimosso dall'insieme Request.Cookies.

La richiesta che l'utente sta eseguendo risulta a questo punto anonima poiché il server non ha ancora convalidato le credenziali dell'utente. Quando la richiesta passa attraverso la pipeline di ASP.NET, la classe UrlAuthorizationModule controlla se l'utente ha accesso alla pagina. Poiché un utente anonimo non ha accesso a una pagina SecurePage.aspx, la classe UrlAuthorizationModule restituisce un messaggio di errore 401 ("Accesso negato"), che causa il reindirizzamento alla pagina di accesso.

Per evitare questo problema, è innanzitutto necessario rimuovere l'attributo requireSSL dal tag <forms> nel file di configurazione. Quindi sarà necessario impostare a livello di codice l'attributo secure nel cookie FormsAuthentication. Questa operazione viene eseguita automaticamente dal codice seguente, sia per il cookie FormsAuthentication che per il cookie Session.
void Application_EndRequest(object sender, EventArgs e){     if (Response.Cookies.Count > 0)     {          foreach (string s in Response.Cookies.AllKeys)          {               if (s == FormsAuthentication.FormsCookieName || s.ToLower() == "asp.net_sessionid")               {                    Response.Cookies[s].Secure = true;               }          }     }}
Riferimenti
Per ulteriori informazioni sul controllo Menu, visitare il seguente sito Web MSDN: Per ulteriori informazioni sull'attributo requireSSL della proprietà FormsAuthentication.RequireSSL, visitare il seguente sito Web MSDN: Per ulteriori informazioni sull'attributo IsSecure della proprietà HttpRequest.IsSecureConnection, visitare il seguente sito Web MSDN (informazioni in lingua inglese): Per ulteriori informazioni sulla classe FormsAuthenticationModule, visitare il seguente sito Web MSDN:Per ulteriori informazioni sulla classe UrlAuthorizationModule, visitare il seguente sito Web MSDN:

Spero che abbiate trovato utili queste informazioni per l'utilizzo della terminazione SSL e Microsoft ASP.NET. Ricordate che gli articoli di Support Voice sono pensati per voi. Come sempre, inviate liberamente le vostre idee sugli argomenti che vorreste fossero trattati nei prossimi articoli o nella Knowledge Base utilizzando il modulo Ask For It.
Proprietà

ID articolo: 910444 - Ultima revisione: 02/26/2008 16:40:24 - Revisione: 1.3

  • Microsoft ASP.NET 2.0
  • kbhowto kbasp KB910444
Feedback