Poblema passaggio di variabili sessione da Clasic ASP ad ASP.NET

domenica 28 settembre 2008 - 11.14

lelig Profilo | Newbie

Salve, ho necessità di implementare un sistema per far si che si ottenga accesso ad una pagina aspx solo se si è stati autenticati da una pagina Classic ASP. Prendendo spunto dall'articolo presente a questo link: http://www.aspitalia.com/articoli/asp.net/condivisione_session_application.aspx , ho realizzato le seguenti pagine:

readvar.asp (che legge le variabili sessione)
------------------
<%@Language=VBScript%>

<%
on error resume next
tipo=request("type")
name=request("name")

if tipo="Session" then
if Session(name)="" then
Response.Write(" ")
else
Response.Write(Session(name))
end if
end if

if tipo="Application" then
if Application(name)="" then
Response.Write(" ")
else
Response.Write(Application(name))
end if
end if
Response.End()
%>
--------------

e picgen.aspx
(che dovrebbe eriditare l'autenticazione in classic asp leggendo la variabile sessione IDUPhotobook da readvar.asp e stamparla a video per verificarne la correttezza)

---------------
<%@ Page Language="vb"%>
<%@ Import Namespace="System.IO"%>
<%@ Import Namespace="System.Net"%>

<SCRIPT language="vb" runat=server>

Sub page_load(o as object,e as eventargs)

Dim myRequest As HttpWebRequest = WebRequest.Create("http://www.lelig.com/photobook/readvar.asp?type=Session&name=IDUPhotobook")

Dim myResponse As HttpWebResponse = myRequest.GetResponse()
Dim sr As New StreamReader(myResponse.GetResponseStream())
Dim contenuto_variabile As String = sr.ReadToEnd()

Response.Write(contenuto_variabile)
Response.End()


End Sub
</script>

ho entrambe le pagine nella stessa directory web all'indirizzo http://www.lelig.com/photobook/ (già caricate).
Il sitema però non stampa a video alcunchè (la pagina risultante in explorer è vuota).
Il problema è che dopo vari controlli e ricontrolli mi sono accorto che la variabile contenuto_variabile è vuota.

Ho provato a cambiare la riga

Dim myRequest As HttpWebRequest = WebRequest.Create("http://www.lelig.com/photobook/readvar.asp?type=Session&name=IDUPhotobook")

con

Dim myRequest As HttpWebRequest = WebRequest.Create("http://www.lelig.com/photobook/abc.asp)

dove abc è un file statico che contiene solo la parola TEST (o qulsiasi altra roba di testo), ed allora tutto funziona.
Il sistema implementato sembra leggere pagine statiche ma non quelle generate tramite asp con metodo response write o altro. Insomma sembra che il metodo HttpWebRequest non riesca ad ottenere informazioni da pagine che devono prima essere compilate su server.

Spero di essermi spiegato bene. Qualcuno ha la soluzione a questo problema (o può proporre soluzioni alternative senza uso di cookies) ?

Ringrazio anticipatamente.

Brainkiller Profilo | Guru

>Salve, ho necessità di implementare un sistema per far si che
>si ottenga accesso ad una pagina aspx solo se si è stati autenticati
>da una pagina Classic ASP. Prendendo spunto dall'articolo presente
>a questo link: http://www.aspitalia.com/articoli/asp.net/condivisione_session_application.aspx

Ciao,
mi piacerebbe farti rispondere dall'autore dell'articolo, mio amico, ma fino a domani non lo trovo.
Allora, l'articolo è corretto, e anche la procedura, io però la semplificherei un po'.

La chiave di tutto è passare i parametri nella URL come indicato.

Tu ti autentichi sulla pagina .asp poi metterai un link alla pagina .aspx con un parametro tipo pagina.aspx?ID= e dentro l'ID potrai mettere per esempio un Hash di username e password.
Nella pagina .aspx fai una Request e verifichi se l'Hash corrisponde allora forzi l'autenticazione dell'utente e a quel punto è loggato anche nella applicazione ASP.NET.

Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

lelig Profilo | Newbie

Innanzitutto ti volevo ringraziare x il tuo aiuto....

Se ho capito bene tu mi dici di saltare l'httpWebRequest e passare l'hash di username e pw nella queristring dalla pagina asp a quella aspx in modo che la aspx controllando la correttezza delle informazioni possa forzare l'auenticazione. Forse mi sbaglio, ma così non ho una falla nella sicurezza?, basta che uno copia il link con la querystring e l'hash code, lo da in giro e chiunque può accedere direttamente alla pagina aspx senza autenticarsi.

Il problema che ottengo è forse un cavillo riguradante la compilazione di pagine server-side. E' possibile che il metodo streamReader di Asp.NET non riesca a leggere pagine che devono essere prima compilate dal motore Asp?

Brainkiller Profilo | Guru

>informazioni possa forzare l'auenticazione. Forse mi sbaglio,
>ma così non ho una falla nella sicurezza?, basta che uno copia
>il link con la querystring e l'hash code, lo da in giro e chiunque
>può accedere direttamente alla pagina aspx senza autenticarsi.

Esatto, infatti volevo vedere cosa rispondevi prima di proseguire con la risposta. Non so la tua applicazione dove verrà usata se internamente esternamente ecc. Sulla base di questo puoi anche decidere che soluzione utilizzare e quanto renderla sicura. Non chè se venga pubblicata all'interno dell'azienda non debba essere sicura, anzi...

Volevo completare dicendo che questa è la soluzione più banale, tu puoi non solo creare l'hash (magari solo di Username se no creare l'hash della password diventa davvero pericoloso) ma puoi in alternativa criptare queste informazioni ed altre (per esempio l'IP del chiamante e l'ora) e passarle nella URL.

Questo ti consente dalla parte ASP.NET intanto di verificare se colui che sta arrivando è stato preventivamente autenticato dalla parte ASP (tramite l'IP criptato) e non abbia ricevuto per esempio via IM o Mail il link di accesso copiato e incollato. Inoltre l'ora ti consente di mantenere valido l'accesso per una finestra temporale tipo, se l'utente clicca sul link nella pagina .asp entro 30 secondi dalla visualizzazione riesce ad autenticarsi ed accedere all'ASP.NET se attende o copia e incolla il link passandolo a qualcun'altro, quest'altro non riuscirà ad avere accesso. Comunque il doppio controllo IP / Ora criptati ti permette un'identificazione secondo me sicura.

>Il problema che ottengo è forse un cavillo riguradante la compilazione
>di pagine server-side. E' possibile che il metodo stremaReader
>di Asp.NET non riesca a leggere pagine che devono essere prima
>compilate dal motore Asp?

Ti faccio rispondere se riesco domani da Andrea Zani l'autore.

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

lelig Profilo | Newbie

Ti ringrazio per la tua precisione e disponibilità, allora attenderò domani per ulteriori suggerimenti. Grazie ancora.

lanfra Profilo | Senior Member

Avevo un problema simile sulla mia intranet.
L'autenticazione dell'utente [recupero dati da DB, parametri utente...] avveniva in AspClassic, quando dovevo passare in ASP.Net sul load della pagina inserivo il codice.

If Request.Form("utente") IsNot Nothing Then Session("Utente") = Request.Form("utente").ToString() Else Throw New Exception("Tornare alla pagina di login e autenticarsi.") End If

e se avevo bisogno mi ricalcolavo i dati utente che mi servivano.
Tu potresti mettere anche la password come request.form("psw")....
naturalmente nella pagina asp si passa tutto con form method post
Lanfra

lelig Profilo | Newbie

La tua soluzione è valida ma è stata scartata poichè necessita comunque di un form per inviare i dati ogni volta tra una pagina e l'altra, tralasciando inoltre il fatto che le password sono comunque inviate avanti ed indietro ad ogni passaggio (cosa non affidabile). Ti ringrazio comunque per l'interessamento.

lanfra Profilo | Senior Member

Passare la password tra pagine è sempre una cosa rischiosa,ma vuoi implementare un controllo "autenticazione utente" ad ogni pagina? Non conviene impostare il controllo alla login, valorizzi i tuoi dati Utente e li passi tra pagine? Naturalmente il caricamento iniziale della pagina avviene in funzione dei parametri che gli passi...
Lanfra

Brainkiller Profilo | Guru

>Ti ringrazio per la tua precisione e disponibilità, allora attenderò
>domani per ulteriori suggerimenti. Grazie ancora.

Aspettavo anche una tuo commento sulla tua risposta.

Relativamente al tuo intervento successivo, non è necessario passare la password nella URL anzi te l'ho detto anche io che non si deve fare, neanche criptandola perchè non serve. All'applicazione ASP.NET devi solo comunicare in qualche modo che l'utente che la sta visionando è autenticato correttamente nella applicazione ASP punto e stop. Per questo sarebbe sufficiente passare Userid=3&Authenticated=1 per esempio, però come hai detto tu se copi e incolli il link ci può entrare qualcun altro, allora combina queste informazioni con l'IP e con un blocco temporale cripta tutto e sei a posto.
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

lelig Profilo | Newbie

Penso che alle strette userò questa, anche se volevo comunicare che facendo delle prove con fastweb (che mostra al server che ospita il sito lo stesso ip pubblico per vari gruppi di indirizzi) permette facilmente l'accesso tramite il passaggio del link tra due persone della stessa zona. Lascio il thread aperto ancora un pò per vedere se qualcuno sbroglia il dilemma dell'httpwebrequest. Grazie.

Brainkiller Profilo | Guru

>Penso che alle strette userò questa, anche se volevo comunicare
>che facendo delle prove con fastweb (che mostra al server che
>ospita il sito lo stesso ip pubblico per vari gruppi di indirizzi)
>permette facilmente l'accesso tramite il passaggio del link tra
>due persone della stessa zona. Lascio il thread aperto ancora
>un pò per vedere se qualcuno sbroglia il dilemma dell'httpwebrequest.
>Grazie.

Ciao,
ti posto la risposta di Andrea Zani che propone un'altra soluzione:

Ciao Lelig,
da ciò che ho capito tu hai un'altra necessità: autenticazione mista tra un'applicazione in classic asp, e una in asp.net. C'è un modo antico come il web stesso per permettere l'autenticazione in questo modo all'interno dello stesso dominio di appartenenza: il cookie. Un cookie inviato al client è leggibile anche da asp.net, e viceversa. E' sufficiente inserire le informazioni di interesse crittografate in un cookie per non tirare in ballo session o quan'altro.

Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

lelig Profilo | Newbie

Ho contemplato questa soluzione (peraltro validissima), infatti cercavo di risolvere nell'altro modo sia per complicarmi un po la vita (altrimenti nn c'è gusto..) sia per far si che possa essere possibile accedere anche dai browser con cookie disabilitati (per questo nel post precedente avevo escluso l'utilizzo di cookie).

Ora sto cercando di risolverè con quersto sistema qui
http://www.eggheadcafe.com/articles/20041017.asp
Solo che cerco il modo di chiamare la funzione TransferSession() dalla pagina interessata ma non riesco a caipre come impostare i 2 argomenti della stessa nella chiamata. Posto il frammento di codice interessato


[frammento PAGINA picgen.aspx.cs]

.....

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{


/* Parte di codice su cui sto facendo i tentativi */
System.Web.HttpRequest request = New System.Web.HttpRequest("readvar.asp","http://www.lelig.com/photobook/readvar.asp",""); //(?)
HttpSessionState session; //(?)

TransferSession(request, session); // Chiamo transferSession() (ma che gli devo passare come argomenti? sto facendo vari tentativi...)

Label.Text = Session["IDUPhotobook"].ToString(); //Stampo a video il contenuto ottenuto dalla variabile sessione IDUPhotobook

}

..... (in allegato la pag. completa)


ovviamenrte mi da come errore parametri sbagliati in ingresso alla funzione o variabili non assegnate o assegnate in maniera incorretta (nei diversi tentativi che ho fatto).


PS.

Volevo approfittare per sottolineare la gentilezza e disponibilità di tutti voi in questo forum (sono nuovo questo è il mio primo post) nell'aiutarmi a realizzare il mio progetto. Grazie
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2014
Running on Windows Server 2008 R2 Enterprise, SQL Server 2008 & ASP.NET 3.5