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

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

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

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

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

person Nicolas Raoul    schedule 10.08.2015    source источник


Ответы (2)


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

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

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

Откройте соединение (в данном случае HTTP-запрос) к URI защищенного ресурса. Поскольку запрос еще не прошел проверку подлинности, агент CA SSO выполнит перенаправление на страницу входа. В коде 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 интересно тем, что есть два варианта. В примере программы используется более простой подход: для типа содержимого устанавливается значение application/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
person Mohit Shrivastava    schedule 26.08.2015
comment
Выглядит отлично! Может быть, у вас есть такой же код на C#? После того, как пользователь/пароль POST будет выполнен, могу ли я отправлять запросы в обычном режиме, как если бы Siteminder не присутствовал, или мне нужно добавить какой-то заголовок или что-то в этом роде? - person Nicolas Raoul; 26.08.2015
comment
Если я правильно понимаю, первый запрос ДОЛЖЕН быть HTTP, а второй запрос ДОЛЖЕН быть HTTPS? Если да, не могли бы вы исправить свое предложение Следующий шаг включает создание HTTP-запроса, который отправляет все данные формы в POST, это должен быть HTTPS, верно? благодарю вас :-) - person Nicolas Raoul; 26.08.2015

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

        //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.
person tman    schedule 01.07.2016