Simulare il Post e successivamente effettuare un Redirect (non va!)

mercoledì 11 aprile 2012 - 16.20
Tag Elenco Tags  C#  |  .NET 3.5  |  Windows 7  |  Visual Studio 2010  |  CSS 2.1  |  XHTML 1.0

sarax Profilo | Newbie

Ciao a tutti.
Ecco il mio problema.
Da una pagina .aspx simulo il post verso un handler .ashx, dal quale vorrei fare un redirect su un'altro handler. Il problema è che il redirect non viene fatto.

Ecco un esempio del codice:

Pagina Test.aspx
-------------------------
var request = WebRequest.Create("http://localhost/In.ashx") as HttpWebRequest; request.AllowAutoRedirect = false; request.ContentType = "application/x-www-form-urlencoded"; request.Method = "POST"; // aggiungo qualcosa nell'header che dovrò leggere successivamente request.Headers.Add("LoginCF", "AAABBB11C11D111E"); var postData = "ALCUNI DATI DI POST" byte[] buffer = Encoding.UTF8.GetBytes(postData); request.ContentLength = buffer.Length; using (var dataStream = request.GetRequestStream()) { dataStream.Write(buffer, 0, buffer.Length); }

Handler In.ashx
-----------------------
//leggo i dati dell'Header //..... //il codice qui sotto non funziona context.Response.Redirect("AltroHandler.ashx", true);

Sara M.

TOPOAMORE Profilo | Expert

Ciao,

se dici la motivazione di tutto ciò magari possiamo darti qualche altro consiglio o strada da percorrere

:)
__.__.__.__.__.__

http://salvatorecervone.wordpress.com

ASP 2.0 - VB 2008

sarax Profilo | Newbie

A grandi linee la situazione è questa: c'è un'applicazione web (A1) che deve visualizzare una pagina di un'altra applicazione web (A2).
Per accedere ad A2 si passa dalla pagina di Login che effettua l'autenticazione (database e forms authentication).
A1 non può chiamare direttamente la pagina di A2 che vuole visualizzare perchè viene "ributtata" sulla pagina di Login.

La soluzione pensata è stata:
A1 chiama un handler .ashx (H1) che si trova su A2 simulando un POST. In questo modo passa nell'header HTTP i dati che servono per l'autenticazione e nel post altri dati che servono.
H1 fa un redirect ad un altro handler (H2) sempre su A2 che si occupa di fare una serie di controlli e (se tutto va bene) effettua l'autenticazione (creando il cookie di autenticazione).
(infatti l'utente che arriva da A1 deve comunque essere autorizzato a visualizzare la pagina di A2, senza passare però dalla pagina di login).
Successivamente salva un valore in sessione (tipo autenticazOk) e fa un redirect su H1.
H1 vede che c'è il valore salvato in sessione e quindi sa che l'utente è stato autenticato. A questo punto fa un altro redirect sulla pagina di A2 richiesta inizialmente.

Io ho fatto una pagina di test che simula la web application A1 e fa un post su H1. Il problema è che da H1 non posso fare nessun redirect su H2 perchè non lo esegue.

Spero di essere stata abbastanza chiara e che possiate darmi una mano perchè non riesco a venirne fuori. Sono accettate anche soluzioni alternative.

Dimeticavo: A1 non è sviluppata da me e non posso in alcun modo intervenire, se non dicendo come devono essermi passati di dati su H1. Io posso intervenire invece su A2.

Grazie.
Sara M.

TOPOAMORE Profilo | Expert

Ciao,

ma le due applicazioni sono 2 sottodomoni dello stesso dominio???

es:

app1.dominio.it
app2.dominio.it
__.__.__.__.__.__

http://salvatorecervone.wordpress.com

ASP 2.0 - VB 2008

Gluck74 Profilo | Guru

mamma mia che rigiro pazzesco.

Io utilizzerei un semplicissimo webService sul sito 2, che riceve i dati in post dal sito 1.
Verifica se l'utente può ricevere la risposta, fa quello che deve fare (esempio estra i dati che servono, preleva il render di una pagina, ecc.. ecc..) e manda i dati indietro al sito 1.

ciao

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

sarax Profilo | Newbie

In realtà non deve rimandare indietro niente.
Nel senso che: ci sono utenti che accedono al sito 1 e che si loggano. Questi utenti, oltre a lavorare sul sito 1, devono poter "entrare" nel sito 2 e fare delle operazioni. In particolare schiacciano un pulsante sul sito 1 che chiama un handler del sito 2 (passando nell'header http i dati che servono per l'autenticazione e nel post altri dati). Il sito 2 non li deve ri-buttare sulla pagina di login, ma deve effettuare l'autenticazione e ri-spedirli su una pagina del sito 2. Qui loro sono a tutti gli effetti sul sito 2 e possono fare tutte le operazioni previste (tipo modifica dei dati).
Solo nel caso di alcuni casi di errore ben definito, il sito 2 (l'handler) chiama un Web Service del sito 1 passandogli il messaggio di errore.

Facendo altri test ho notato che il Redirect non funziona, ma funziona il Server.Transfer / Server.Execute. Peccato che in questo modo anche ricreando l'autenticazione (senza farlo passare dalla pagina di Login), l'utente risulta sempre non autenticato.


Sara M.

TOPOAMORE Profilo | Expert

Ciao

allora a questo link

http://weblogs.asp.net/hernandl/archive/2004/06/09/ssoformsauth.aspx

c'e' una spiegazione dettagliata del tuo problema e dell'autenticazione dal sito 1 al 2 come vuoi tu andando a creare un ticket valido per entrambi...

Ora pero ci sono varie casistiche e in base a quello devi scegliere quello piu idoneo per te...

Per ci sono da fare delle impostazioni sull'APP1 e sull'APP2 nei relaivi web.config....

Vedi se fa al caso tuo

ciaooo
__.__.__.__.__.__

http://salvatorecervone.wordpress.com

ASP 2.0 - VB 2008

sarax Profilo | Newbie

Intanto grazie per le risposte.
Però non posso modificare il web.config di A1.

Forse però ho trovato una soluzione (non so se è la migliore, ma sembra che funzioni).
Eccola:
A1 chiama una pagina di A2 tramite un POST (passando nell'Header i parametri necessari all'autenticazione su A2 e nel Post altri dati).
A2 effettua l'autenticazione, salvando in sessione i dati che riceve.
Successivamente A1 chiama un'altra pagina di A2 tramite una GET.
Quest'altra pagina di A2 verifica se l'utente è autenticato (e lo è), effettua una serie di operazioni e poi fa un redirect su un'altra pagina di A2.

Lo scenario concreto è: un utente autenticato su A1 deve poter inserire una pratica su A2 (che gestisce le pratiche) e visualizzare la pratica creata (cioè la pagina Pratica.aspx di A2. Però su questa pagina ci può arrivare solo dopo essersi autenticato su A2.

La soluzione di far fare ad A1 prima un POST su una pagina che si occupa dell'autenticazione e poi una GET su una pagina che si occupa di elaborare i dati, funziona perchè mi permette di fare il redirect sulla pagina della pratica (cosa che non riuscivo a fare arrivando da un POST).
Sara M.

TOPOAMORE Profilo | Expert

Ciao se hai trovato la soluzione bene....

ma non dovevi modificare il web.config di A1 ma farti dare le chiavi di machine per configurare il tuo.....

cosi potevi creare le autenticazioni senza problemi da A1 a A2

Se hai risolto meglio cosi :)

Ciaoooo
__.__.__.__.__.__

http://salvatorecervone.wordpress.com

ASP 2.0 - VB 2008
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5