authentication - AD 可以为我的 Win 桌面应用程序提供我的 Web 服务凭据吗?
问题描述
我有一个工作的 c#/dotnet Windows 桌面应用程序,它通过在我的 Web 应用程序中访问各种 Web 服务来完成它的工作。当桌面应用程序启动时,它会提示用户输入用户名/密码,然后点击我的登录 Web 服务,该服务返回一个会话令牌。
我有一个有很多用户的大型客户。该客户希望直接从其域控制器为我的组合桌面/Web 应用程序提供身份验证/授权。他们想要单点登录,所以我的桌面应用程序不会提示他们的用户输入用户名和密码。
我的桌面应用程序如何从 Windows(可能来自用户的安全主体对象)检索可用的身份验证/授权令牌?我的 Web 应用程序如何验证该令牌,以便它可以信任桌面应用程序并向其发送会话令牌?
(我的 Web 应用程序在我的环境中运行,而不是在客户的域中。)
对于纯网络应用程序客户,我使用 SAML2 和 Active Directory / 联合服务成功地做到了这一点。SAML2 舞蹈让我的用户的浏览器向客户的 AD/FS 服务器发布请求,然后将签名的响应发布回我的 Web 应用程序。
但我无法弄清楚如何从桌面应用程序中干净利落地做到这一点。有什么智慧吗?
解决方案
我应该以我从未这样做过的事实作为开头,所以我不能给你确切的代码,但我可以为你指出正确的方向。
您应该能够使用 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 请求,并使用浏览器的开发工具准确检查流量的外观,并使用该信息复制相同的请求在你的代码中。
推荐阅读
- javascript - 使用 Modular SDK v9 的 Firestore 条件 where 子句
- node.js - 使用另一层的 AWS Lambda 层
- python - 如何对 Pandas 数据框进行分组并显示 HTML 表格
- node.js - 使用 2 个不同的套接字将 2 个完全不同的客户端连接到同一服务器
- sql - 如何在给定特定条件的情况下将两个表合并在一起 - Oracle SQL
- javascript - 在 React Redux 中,每个提供者/组件子树可以像 Context API 那样拥有多个存储吗?
- flutter - 在 Flutter 中对齐文本
- android - 我的 react-native 应用程序无法识别 react-native-image-crop-picker
- awk - 在第一列和第二列之间添加一个新列,其值为从 1 到 5 的数字,根据需要重复以达到总行号
- netbeans-12 - 我的 apache NetBeans 不工作。它仅在启动时才加载模块它变为空白