Подтвердить что ты не робот

HTTP-запрос от настольного приложения С# к серверу, защищенному сервером

Я разработал настольное приложение С#, которое делает HTTPS-запросы серверами клиентов (обычно это серверы Documentum/SharePoint/Alfresco/NemakiWare/etc HTTPS).

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

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

  • Я разработал поддержку NTLM-SSO для нашего настольного приложения С#, и он работает хорошо, но я не уверен, как действовать для CA SSO.
  • Я спросил тот же вопрос на форуме CA, но, как и большинство вопросов, он остается без ответа.
4b9b3361

Ответ 1

Чтобы выполнить аутентификацию с помощью SSO SS и затем подключиться к нужному URL-адресу, нам необходимо получить доступ к защищенному ресурсу на веб-сервере, настроенном на использование аутентификации SS SSO:

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

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

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

Ответ 2

Те же идеи, что и Mohit, но это можно сделать с гораздо более простым кодом:

        //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.