Authentication AD可以为我的Win桌面应用程序提供web服务的凭据吗?

Authentication AD可以为我的Win桌面应用程序提供web服务的凭据吗?,authentication,active-directory,ldap,single-sign-on,desktop-application,Authentication,Active Directory,Ldap,Single Sign On,Desktop Application,我有一个正在运行的c#/dotnet Windows桌面应用程序,它通过点击我的web应用程序中的各种web服务来完成工作。当桌面应用程序启动时,它会提示用户输入用户名/密码,然后点击my login web服务,该服务返回会话令牌 我有一个拥有许多用户的大型org客户。该客户希望直接从其域控制器为我的组合桌面/web应用程序提供身份验证/授权。他们想要单点登录,所以我的桌面应用程序不会提示他们的用户输入用户名和密码 我的桌面应用程序如何从Windows(可能从用户的安全主体对象)检索可用的身份

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

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

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

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

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


但我不知道如何从桌面应用程序干净地完成它。有什么智慧吗?

我应该先说一个事实,我从来没有这样做过,所以我不能给出确切的代码,但我可以为您指出正确的方向

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

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

var httpClient = new HttpClient(new HttpClientHandler() 
                  {
                      UseDefaultCredentials = true
                  });
然后,每当您的
httpClient
发送一个被401响应质询的请求时,它将自动使用用户的Windows凭据重新发送该请求。这正是web浏览器所能做的。所以当你拿到代币时就用这个

您可能必须在请求中发送一个用户代理字符串,因为ADFS似乎是

拥有令牌后,在对web服务的请求中使用令牌


关键是你在复制浏览器的功能。因此,如果您在设置HTTP请求的外观时遇到问题,那么可以从浏览器访问API中的GET请求,并使用浏览器的开发工具精确检查通信量的外观,并使用该信息在代码中复制相同的请求。

您可以在github(jelledruyts)中查看此示例:

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


我建议你读这篇文章。这本书有点老,但它是一个很好的概述/回顾

代币有许多不同的格式。对于今天的.NET应用程序, 然而,三种代币是最重要的。它们是 以下:

  • 用户名/密码令牌-这个非常简单的令牌只包含两个 声明:某个主题的名称和该主题的密码
  • Kerberos票证-比用户名/密码令牌更复杂 票证包括受试者的姓名、受试者窗口的名称 域和其他信息。由颁发的Kerberos票证 Active Directory还包括一个包含安全性的扩展 标识受试者和受试群体的标识符(SID) 这个题目属于我
  • SAML令牌-安全断言标记 语言(SAML)是OASIS拥有的一种基于XML的语言 多供应商标准组。与其他标记类型不同的是 如本文所述,SAML令牌没有固定的声明集 为它定义。相反,这种令牌可以包含任何声明 它的创造者选择的

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

  • 验证用户的身份(…)
  • 做出授权决策(…)
  • 了解此用户的情况(…)

  • 身份验证类型:

  • 基于域的身份验证(如Kerberos票据)
  • 基于域的应用程序只接受具有 固定的索赔集合。一个常见的例子是Windows应用程序 只接受Kerberos票证。这种应用很容易实现 创建,并且它在单个Windows域中运行良好。问题 这种简单化的数字身份识别方法不再适用 足以满足许多应用

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


    身份识别技术

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