Per l'autenticazione con CA SSO e quindi connettersi l'URL desiderato abbiamo bisogno di accedere a una risorsa protetta su un web server configurato per utilizzare l'autenticazione CA SSO:
- richiede una risorsa sul server, utilizzando una richiesta HTTP.
- La richiesta viene ricevuta dal server Web e intercettata dall'agente Web CA SSO.
- L'agente Web determina se la risorsa è protetta o meno e, in tal caso, raccoglie le credenziali dell'utente e le passa al server delle politiche.
- Il server delle politiche autentica l'utente e verifica se l'utente autenticato è autorizzato o meno per la risorsa richiesta, in base alle regole e alle politiche contenute nell'archivio delle norme.
- Dopo che l'utente è stato autenticato e autorizzato, il server Policy garantisce l'accesso alle risorse protette.
Ciò si ottiene con le seguenti fasi:
aprire una connessione (richiesta HTTP in questo caso) per l'URI della risorsa protetta. Poiché la richiesta non è ancora stata autenticata, l'agente SSO di CA rilascerà un reindirizzamento a una pagina di accesso. Nel codice, AllowAutoRedirect
è impostato su falso. Questo è importante in quanto sarà necessario l'URL di reindirizzamento per il successivo POST dei dati di accesso nel passaggio 3 di seguito. Se AllowAutoRedirect
erano True, la risposta non includerebbe un'intestazione di posizione e il successivo POST verrebbe creato all'URL originale, che quindi reindirizzerà nuovamente alla pagina di accesso. Tuttavia, si verifica un POST tra un client e il server, tutti i dati POST trasportati nel payload della richiesta del passaggio 3 andranno persi durante il reindirizzamento.
Dim request As HttpWebRequest
Dim response As HttpWebResponse
Dim url As String = PROTECTED_URL
request = WebRequest.Create(url)
request.AllowAutoRedirect = False
response = request.GetResponse
' make sure we have a valid response
If response.StatusCode <> HttpStatusCode.Found Then
Throw New InvalidProgramException
End If
' get the login page
url = response.Headers("Location")
request = WebRequest.Create(url)
request.AllowAutoRedirect = False
response = request.GetResponse
Il passo successivo prevede la creazione di una richiesta HTTPS che i messaggi tutti i dati del modulo, tra userid e password, al server. Lo scopo di un agente di autenticazione è verificare l'identità di un utente convalidando il loro userid e password. Pertanto, i loro URL usano naturalmente SSL (secure sockets layer) e sono criptati per noi, quindi non richiediamo ulteriore crittografia nel nostro programma. Tuttavia, la formattazione dei dati POST è interessante in quanto ci sono due alternative.Il programma di esempio utilizza l'approccio più semplice per impostare il tipo di contenuto su application/x-www-form-urlencoded. Qui i dati POST sono formattati in modo simile a una stringa di query e inviati come parte della richiesta successiva.
Dim postData As String
postData = ""
For Each inputName As String In tags.Keys
If inputName.Substring(0, 2).ToLower = "sm" Then
postData &= inputName & "=" & _
HttpUtility.UrlEncode(tags(inputName)) & "&"
End If
Next
postData += "postpreservationdata=&"
postData += "USER=" + HttpUtility.UrlEncode(USERNAME) & "&"
postData += "PASSWORD=" + HttpUtility.UrlEncode(PASSWORD)
request = WebRequest.Create(url)
cookies = New CookieContainer
request.CookieContainer = cookies
request.ContentType = FORM_CONTENT_TYPE
request.ContentLength = postData.Length
request.Method = POST_METHOD
request.AllowAutoRedirect = False ' Important
Dim sw As StreamWriter = New StreamWriter(request.GetRequestStream())
sw.Write(postData)
sw.Flush()
sw.Close()
response = request.GetResponse
fonte
2015-08-26 09:10:13
Sembra fantastico! Ti capita di avere lo stesso codice in C#? Dopo aver eseguito il POST utente/password, posso inviare richieste normalmente come se Siteminder non fosse presente, o devo aggiungere qualche tipo di header o qualcosa del genere? –
Se ho capito bene, la prima richiesta DEVE essere HTTP e la seconda richiesta DEVE essere HTTPS? In tal caso, potresti correggere la frase "* Il prossimo passo prevede la creazione di una richiesta HTTP che POSTs tutti i dati del modulo *" dovrebbe essere HTTPS giusto? grazie :-) –