c# - 从 C# 桌面应用程序到受 Siteminder 保护的服务器的 HTTP 请求

标签 c# single-sign-on desktop-application siteminder

我开发了一个 C# 桌面应用程序,它向客户的服务器发出 HTTPS 请求(通常是基于 Documentum/SharePoint/Alfresco/NemakiWare 等 HTTPS服务器)。

一些客户要求我们支持他们受 CA SSO 保护的服务器(Siteminder 的新名称)。

问题:我需要做什么才能允许我的应用程序向受 CA SSO 保护的服务器发送 HTTPS 请求(并接收响应)?

  • 我已经为我们的 C# 桌面应用程序开发了 NTLM-SSO 支持并且运行良好,但我不确定如何继续进行 CA SSO。
  • 我问过 same question on the CA forum , 但像那里的大多数问题一样,它仍然没有答案。

最佳答案

要使用 CA SSO 进行身份验证,然后连接到所需的 URL,我们需要访问配置为使用 CA SSO 身份验证的 Web 服务器上的 protected 资源:

  1. 使用 HTTP 请求请求服务器上的资源。
  2. 请求由网络服务器接收,并被 CA SSO 网络代理拦截。
  3. Web 代理确定资源是否受到保护,如果受到保护,则收集用户的凭据并将其传递给策略服务器。
  4. 策略服务器根据策略存储中包含的规则和策略对用户进行身份验证,并验证经过身份验证的用户是否有权使用所请求的资源。
  5. 用户通过身份验证和授权后,策略服务器授予对 protected 资源的访问权限。

这是通过以下步骤完成的:

打开到 protected 资源的 URI 的连接(在本例中为 HTTP 请求)。由于请求尚未经过身份验证,因此 CA SSO 代理将发出重定向到登录页面的请求。在代码中,AllowAutoRedirect 设置为 false。这很重要,因为在下面的第 3 步中,后续登录数据的 POST 将需要重定向 URL。如果 AllowAutoRedirect 为 True,则响应将不包含 Location header ,随后的 POST 将发送到原始 URL,然后再次重定向到登录页面。但是,客户端和服务器之间发生了 POST,在重定向过程中,步骤 3 请求的有效载荷中携带的任何 POST 数据都将丢失。

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 请求,将所有表单数据(包括用户 ID 和密码)POST 回服务器。身份验证代理的目的是通过验证用户 ID 和密码来验证用户的身份。因此,他们的 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

关于c# - 从 C# 桌面应用程序到受 Siteminder 保护的服务器的 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31912430/

相关文章:

java - 创建桌面快捷方式

c# - 如何使用 iTextSharp 将多个图像合并为单个 pdf

c# - 如何在 Xamarin Forms 中点击 ViewCell 后刷新 TableView 数据?

c# - 将 GUI 值传递给 backgroundworker 的正确方法?

oauth-2.0 - 单页应用程序 (SPA) 的单点登录 (SSO) 解决方案/架构

angular - 从我的网页打开特定安装的应用程序(在 PC 中)

c# - 自动更新桌面应用程序

c# - .Net Core 正则表达式、命名组、嵌套组、反向引用和惰性限定符

tomcat - 当我的应用程序在 JBOSS EAP 7.0 中运行时无法使用 WSO2 作为识别服务器

iis - 如何在 Windows Server 2012 r2 上为托管在 websphere 上的应用程序创建自签名证书