为用户 (S4U) 令牌创建服务

Posted

技术标签:

【中文标题】为用户 (S4U) 令牌创建服务【英文标题】:Creating a service for user (S4U) token 【发布时间】:2014-07-30 04:19:12 【问题描述】:

Windows 任务计划程序可以创建使用特定用户帐户运行的任务,而无需存储用户密码。他们称之为“S4U”,为用户服务。这应该像调度程序为当前用户创建这样的令牌并可以使用它在该用户帐户下运行调度进程一样工作。他们声称它无法使用该系统访问网络或加密资源。调度程序本身使用 SYSTEM 帐户运行以使其工作。这是article that describes it。相关引述:

TASK_LOGON_S4U 是另一个提供更安全的选项 选择。它利用用户 (S4U) 登录服务 代表指定用户运行任务,但不必 存储密码。由于任务计划程序在本地运行 系统帐户,它可以创建 S4U 登录会话并接收令牌 不仅可以用于识别,还可以用于 在本地计算机上模拟。通常一个 S4U 令牌是唯一的 用于识别。

我需要在我的应用程序中使用此身份验证方案,但不能让任务计划程序执行,但需要自己执行,因为我需要它用于任意数量的帐户。每当用户向我的应用程序注册任务时,任何后续任务都必须在同一用户下运行。但由于它们不能重叠,我需要自己进行序列化。

我找不到关于“S4U”这个东西的任何信息。我如何在我的应用程序中实现它?首选 C#,但 WINAPI 和 C 也可以。

更新:这是我尝试过的,但它不起作用。

// The WindowsIdentity(string) constructor uses the new
// Kerberos S4U extension to get a logon for the user
// without a password.
WindowsIdentity wi = new WindowsIdentity(identity);
WindowsImpersonationContext wic = null;
try

  wic = wi.Impersonate();
  // Code to access network resources goes here.

catch()

  // Ensure that an exception is not propagated higher in the call stack.

finally

  // Make sure to remove the impersonation token
  if( wic != null)
    wic.Undo();

但我现在的印象是,你不能只是说你想成为某个用户。甚至不像系统。您需要以该用户身份登录,并且可以生成一些令牌,以便您稍后再次成为该用户,无需密码。所以这必须是两步的事情,首先我需要获取令牌并将其存储在磁盘上;稍后我可以使用该令牌来模拟。这些例子都没有解释这一点。

【问题讨论】:

MSDN 搜索似乎提供了您需要的所有信息:social.msdn.microsoft.com/Search/…;特别是,LsaLogonUser API 函数完成了所有繁重的工作。 @HarryJohnston:这对我没有帮助。我不知道如何使用这个 API,没有工作示例。此外,我没有使用 WCF 或 ASP.NET,计算机可能加入也可能不加入域。我试过简单的WindowsIdentity 构造函数,但它说没有什么可以验证这个信息,或者什么。听起来它需要一个域控制器。但任务计划程序可以不用。 好吧,你试过什么?有没有看示例代码in the first article? 编辑了我关于什么不起作用的问题。虽然第一篇文章看起来像仅域控制器和服务器,并且代码完全不可读,但我会在家里尝试一下(在非域机器上)。 进程是否具有“作为操作系统的一部分”的权限?代码在哪里失败,出现什么错误代码或异常? 【参考方案1】:

“计算机可能未加入域”

S4U 需要访问 KDC。 S4U 实际上是两种协议。 S4U2Self 和 S4U2Proxy。它正在做的是使用 Kerberos 的附加功能为用户获取服务票证,但获取票证的帐户必须启用特殊委派。 See here 用于此设置。

但除非你真的让进程终止等,否则为什么不直接获取用户服务票证或 TGT?您的应用程序是本地应用程序还是对用户远程运行的服务?

任务调度程序需要获取一个新的,因为服务票证不是永久有效的。或者在某些委托方案中,用户没有将服务票证传递给应用服务器,然后 AS 通过 S4U2Self 请求和服务票证,然后使用该服务票证通过 S4U2Proxy 向第二个服务请求票证。

【讨论】:

那么在重新启动时是否无法获取新的?在 Windows Server 2016 标准版上,我看到尝试以批处理方式登录的作业,设置为在重新启动之前不保持用户密码正常工作。从此失败。现在将更改为保存密码。要更改为,我必须禁用(这是默认设置)已启用不在本地存储密码的策略设置,想知道这是否也会以某种方式影响 S4U 令牌的存储/更新(例如,将其保存在内存中并且无法存储并在重启后)

以上是关于为用户 (S4U) 令牌创建服务的主要内容,如果未能解决你的问题,请参考以下文章

错误:未强制执行用户名令牌创建的策略

如何安全地存储 Discord(OAuth2) 用户的访问令牌?

如何将条带令牌传递到服务器、创建用户帐户、从信用卡中扣款并将其全部显示在仪表板上

如何使用 Java 创建身份验证令牌

Keycloak:使用 keycloak-admin 为用户生成访问令牌

为社交登录用户生成不记名令牌 Spring Boot