2015-08-10 6 views
13

Я разработал # настольное приложение на C, что делает HTTPS запросы на к серверам клиентов (обычно Documentum/SharePoint/Alfresco/NemakiWare/и т.д. HTTPS- основанные серверы).HTTP запрос из C# настольного приложения на Siteminder защищенный сервер

Несколько клиентов попросили нас поддержать их серверы, которые защищены CA SSO (новое название Siteminder).

ВОПРОС: Что нужно сделать, чтобы мое приложение могло отправлять HTTPS-запросы (и получать ответы) с помощью серверов SSO-защиты?

  • Я разработал поддержку NTLM-SSO для нашего настольного приложения C#, и он работает хорошо, но я не уверен, как действовать для CA SSO.
  • Я спросил same question on the CA forum, но, как и большинство вопросов, он остается без ответа.

ответ

6

Для аутентификации с ЦС ССО, а затем подключить к нужному URL, мы должны получить доступ к защищенным ресурсам на веб-сервере настроен на использование CA SSO аутентификации:

  1. запрашивает ресурс на сервере, используя HTTP-запрос.
  2. Запрос получен веб-сервером и перехвачен веб-агентом CA SSO.
  3. Веб-агент определяет, защищен ли ресурс, и если да, он собирает учетные данные пользователя и передает их на сервер политики.
  4. Политический сервер аутентифицирует пользователя и проверяет, разрешен ли аутентифицированный пользователь для запрашиваемого ресурса на основе правил и политик, содержащихся в хранилище политик.
  5. После авторизации и авторизации пользователя сервер политики предоставляет доступ к защищенным ресурсам.

Это достигается с помощью следующих шагов:

Открыть соединение (запрос HTTP в данном случае) к URI защищенного ресурса. Поскольку запрос еще не прошел проверку подлинности, агент SSO CA выдает перенаправление на страницу входа в систему. В коде AllowAutoRedirect установлено значение false. Это важно, поскольку URL-адрес перенаправления потребуется для последующего POST данных входа в систему на шаге 3 ниже. Если AllowAutoRedirect были True, ответ не включал бы заголовок местоположения, а последующий POST был бы сделан с исходным URL-адресом, который затем перенаправлялся бы на страницу входа. Однако POST происходит между клиентом и сервером, любые POST-данные, переносимые в полезной нагрузке запроса шага 3, будут потеряны во время перенаправления.

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 

Следующий шаг заключается в создании запроса HTTPS, публикующие все данные формы, включая идентификатор пользователя и пароль, обратно на сервер. Целью агента аутентификации является проверка личности пользователя путем проверки их идентификатора пользователя и пароля. Таким образом, их URL-адреса, естественно, используют SSL (уровень защищенных сокетов) и зашифрованы для нас, поэтому мы не требуем дальнейшего шифрования в нашей программе. Тем не менее, форматирование данных POST интересно, так как существует две альтернативы.В образце программы используется более простой подход к настройке типа контента для приложения/x-www-form-urlencoded. Здесь данные POST отформатированы аналогично строке запроса и отправляются как часть следующего запроса.

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

Выглядит отлично! У вас будет такой же код на C#? После того, как POST пользователя/пароль будет выполнен, можно ли отправлять запросы, как если бы Siteminder не присутствовал, или мне нужно добавить какой-то заголовок или что-то еще? –

+0

Если я правильно понял, первый запрос ДОЛЖЕН быть HTTP, а второй запрос ДОЛЖЕН быть HTTPS? Если да, не могли бы вы исправить свое предложение ». Следующий шаг включает в себя создание HTTP-запроса, который POSTs все данные формы *« это должен быть HTTPS правильно? Спасибо :-) –

0

Та же самая идея как ответ Мохит, но это может быть сделано с гораздо более простым кодом:

 //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)); 
  • Хотя это использует RestSharp, он может быть легко воспроизведено с помощью HttpClient или даже HttpWebRequest.