2015-08-10 14 views
13

ho sviluppato un applicazione C# desktop di che rende richieste HTTPS ai server dei clienti (solito Documentum/SharePoint/Alfresco/NemakiWare/etc https- server basati).richiesta HTTP da un C# applicazione desktop per server Siteminder protetto

Diversi clienti ci hanno chiesto di supportare i loro server che sono protetti da CA SSO (nuovo nome di Siteminder).

DOMANDA: Cosa devo fare per permettere la mia applicazione per inviare richieste HTTPS (e ricevere risposte) con i server CA SSO-protetti?

  • Ho sviluppato il supporto NTLM-SSO per l'applicazione desktop C# e funziona bene, ma non sono sicuro su come procedere per CA SSO.
  • Ho chiesto il same question on the CA forum, ma come la maggior parte delle domande lì rimane senza risposta.

risposta

6

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:

  1. richiede una risorsa sul server, utilizzando una richiesta HTTP.
  2. La richiesta viene ricevuta dal server Web e intercettata dall'agente Web CA SSO.
  3. 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.
  4. 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.
  5. 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 
+0

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? –

+0

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 :-) –

0

stessa idea la risposta di Mohit, ma può essere fatto con un codice molto più semplice:

 //Make initial request for SM to give you some cookies and the authentication URI 
     RestClient client = new RestClient("http://theResourceDomain/myApp"); 
     client.CookieContainer = new CookieContainer(); 
     IRestResponse response = client.Get(new RestRequest("someProduct/orders")); 

     //Now add credentials. 
     client.Authenticator = new HttpBasicAuthenticator("username", "password"); 
     //Get resource from the SiteMinder URI which will redirect back to the API URI upon authentication. 
     response = client.Get(new RestRequest(response.ResponseUri)); 
  • Anche se questo utilizza RestSharp, può essere facilmente replicata utilizzando HttpClient o addirittura HttpWebRequest.