【问题标题】:Can AD provide my Win desktop application with credentials for my web services?AD 可以为我的 Win 桌面应用程序提供我的 Web 服务凭据吗?
【发布时间】:2020-01-21 18:45:00
【问题描述】:

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

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

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

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

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

但我不知道如何从桌面应用程序中干净利落地做到这一点。有什么智慧吗?

【问题讨论】:

  • “对于纯网络应用客户,我成功地做到了这一点” - 确实没有什么不同。在“纯网络应用程序”中,浏览器发送当前登录用户的凭据。在您的情况下,您的桌面应用程序需要发送当前登录用户的凭据。无论哪种方式,Web 服务端的设置都是完全相同的。
  • 在 Web 服务端为真。但是桌面应用程序方面呢?这就是我不明白的地方。
  • 桌面应用是用什么语言编写的?
  • 它在 C#/dotnet WPF 中。

标签: authentication active-directory ldap single-sign-on desktop-application


【解决方案1】:

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

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

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

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

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

您可能必须在请求中发送用户代理字符串,因为 ADFS 似乎是 limit WIA to certain agents

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

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

【讨论】:

  • 酷!谢谢。不在客户的 Windows 域中运行的 Web 服务如何验证令牌?是什么阻止了网络蠕虫发送假令牌?
  • 我不完全确定那部分是如何工作的。它必须以某种方式验证令牌。有大量关于 ADFS 的文档,但我觉得它是一个政治家写的(说了很多但什么也没说)。如果您可以联系可以指导您完成设置的 Microsoft 顾问,那可能是您最好的选择。
  • “政治家写的”,哈哈哈。确切地。 Microsoft 的安全文档是由认为 Thomas Aquinas 的著作是清晰的永恒示例的人编写的。 Summa Securitæ 确实如此。
【解决方案2】:

您可以在 github (by jelledruyts) 中查看此示例:Modern claims-based identity scenarios for .NET developers

它包含使用 Azure Active Directory 和/或 Windows Server Active Directory 联合服务的身份验证和授权示例。


我建议阅读这篇文章Digital Identity for .NET Applications。它有点旧,但很好的概述/审查。

令牌有许多不同的格式。对于当今的 .NET 应用程序, 然而,三种令牌是最重要的。他们是 以下:

  1. 用户名/密码令牌——这个非常简单的令牌只包含两个 声明:某个主题的名称和该主题的密码。
  2. Kerberos 票证——比用户名/密码令牌更复杂, 票证包括主题名称、主题窗口的名称 域和其他信息。颁发的 Kerberos 票证 Active Directory 还包括一个包含安全性的扩展 标识主题和组的标识符 (SID) 这个主题属于。
  3. SAML 令牌——安全断言标记 语言 (SAML) 是一种基于 XML 的语言,属于 OASIS 多厂商标准组。与其他令牌类型不同的是 此处描述,SAML 令牌没有一组固定的声明 为它定义。相反,这种令牌可以包含任何声明 由其创建者选择。

一旦声明可用,Windows 就可以使用它们, 应用程序,或两者兼而有之。索赔最常见的用途包括 以下:

  1. 验证用户身份(...)
  2. 做出授权决定(...)
  3. 了解此用户(...)

认证类型:

  1. 基于域的身份验证(例如 Kerberos 票证)

基于域的应用程序只接受带有 固定的索赔集。一个常见的例子是一个 Windows 应用程序,它 仅接受 Kerberos 票证。这种应用很容易 创建,它在单个 Windows 域中运行良好。问题 是这种简单的数字身份方法不再是 足以满足许多应用程序

  1. 基于声明的身份验证(例如 SAML 令牌)

与基于域的应用程序不同,基于声明的应用程序可以 可能接受具有不同声明集的多种令牌格式。 此应用程序接受的令牌格式和声明集是 由应用程序本身决定。


身份技术

  • Active Directory (AD) 域服务(功能齐全的目录服务、Kerbero 票证的令牌源等)
  • Active Directory 联合服务 (ADFS)(支持基于声明的应用程序、SAML 令牌的令牌源
  • Windows CardSpace
  • Active Directory 轻型目录服务(AD 服务的子集)
  • 身份生命周期管理器 (ILM)(不同身份存储之间的同步)
  • Windows 授权管理器(RBAC 工具 - 基于角色的访问控制)
  • Active Directory 权限管理服务 (RMS)

由于 AD 域服务实现了 Kerberos,在 Windows 环境是 Kerberos 票。要使用这个默认值,一个 ASP.NET 应用程序指定 Windows 集成身份验证,而 WCF 应用程序使用适当的绑定,例如 NetTcpBinding。 无论哪种情况,下图都说明了 Windows 如何 具有相同域中的客户端的应用程序可能使用 Kerberos 票证和 AD 域服务


AD FS 的第一个版本仅支持带有 Web 客户端的 SAML。

ADFS 1.0,仅支持浏览器客户端 - 已计划的限制 在该技术的下一个版本中进行更改。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2010-12-15
    • 2016-11-27
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    相关资源
    最近更新 更多