首页 > 解决方案 > AD 可以为我的 Win 桌面应用程序提供我的 Web 服务凭据吗?

问题描述

我有一个工作的 c#/dotnet Windows 桌面应用程序,它通过在我的 Web 应用程序中访问各种 Web 服务来完成它的工作。当桌面应用程序启动时,它会提示用户输入用户名/密码,然后点击我的登录 Web 服务,该服务返回一个会话令牌。

我有一个有很多用户的大型客户。该客户希望直接从其域控制器为我的组合桌面/Web 应用程序提供身份验证/授权。他们想要单点登录,所以我的桌面应用程序不会提示他们的用户输入用户名和密码。

我的桌面应用程序如何从 Windows(可能来自用户的安全主体对象)检索可用的身份验证/授权令牌?我的 Web 应用程序如何验证该令牌,以便它可以信任桌面应用程序并向其发送会话令牌?

(我的 Web 应用程序在我的环境中运行,而不是在客户的域中。)

对于纯网络应用程序客户,我使用 SAML2 和 Active Directory / 联合服务成功地做到了这一点。SAML2 舞蹈让我的用户的浏览器向客户的 AD/FS 服务器发布请求,然后将签名的响应发布回我的 Web 应用程序。

但我无法弄清楚如何从桌面应用程序中干净利落地做到这一点。有什么智慧吗?

标签: authenticationactive-directoryldapsingle-sign-ondesktop-application

解决方案


我应该以我从未这样做过的事实作为开头,所以我不能给你确切的代码,但我可以为你指出正确的方向。

您应该能够使用 ADFS 和 Windows 集成授权 (WIA) 执行此操作。在“纯 Web 应用程序”中,浏览器在授权步骤期间发送当前登录用户的凭据。在您的情况下,您的桌面应用程序需要执行浏览器通常会执行的所有操作。无论哪种方式,Web 服务端的设置都应该完全相同。

在 C# with 中HttpClient,这是重要的部分:

var httpClient = new HttpClient(new HttpClientHandler() 
                  {
                      UseDefaultCredentials = true
                  });

然后,每当您httpClient发送一个受到 401 响应挑战的请求时,它会自动使用用户的 Windows 凭据重新发送该请求。这正是网络浏览器会做的事情。因此,当您获得令牌时使用它。

您可能必须在请求中发送用户代理字符串,因为 ADFS 似乎将WIA 限制为某些代理

获得令牌后,请在对 Web 服务的请求中使用该令牌。

关键是您正在复制浏览器的功能。因此,如果您无法设置 HTTP 请求的外观,请从浏览器访问 API 中的 GET 请求,并使用浏览器的开发工具准确检查流量的外观,并使用该信息复制相同的请求在你的代码中。


推荐阅读