gpt4 book ai didi

c# - 如何验证 WindowsIdentity 实例?

转载 作者:行者123 更新时间:2023-11-30 17:54:29 28 4
gpt4 key购买 nike

我正在尝试在我的 WPF 客户端/服务器 (WCF) 应用程序中使用 Windows Identity Foundation 进行授权,该应用程序可能会或可能不会在与提供身份验证的事件目录相同的信任环境中运行。例如,身份验证可能由事件目录提供,但应用程序可能在云端运行,应用程序的用户配置文件角色/权限将由应用程序数据库提供。

我觉得我的头脑中缺少 WIF 过程的一个基本部分,无法完全理解我应该做什么:

  1. 用户使用 Active Directory 用户名/密码登录 Windows 域
  2. 用户打开我的应用程序。
  3. 我引用登录用户的 WindowsIdentity,现在可以查看他们的登录 token 和所有配置的角色/声明 - 但就像他们可以登录域一样,他们可以登录自己的机器并且仍然拥有WindowsIdentity token 。
  4. 我可以将用户的 Windows 标识与他们在我的数据库中的用户配置文件相关联,并授予他们访问我的应用程序中他们配置文件允许的特定功能的权限。

我缺少的部分是我有这个来自 WindowsIdentity.GetCurrent() 的 WindowsIdentity 实例...我如何验证是什么生成了这个?即它是本地计算机用户还是事件目录用户,如果它是事件目录用户,我怎么知道它是我的真正的事件目录服务器?

例如 - 几个场景:

场景一

  1. 用户使用与我的事件目录域相同的名称来命名他们的本地计算机
  2. 用户在该计算机上创建了一个本地用户,其用户名与他们知道存在于我的事件目录中的用户相同,该用户对我的应用程序具有完全管理访问权限。
  3. 他们登录到我的应用程序,出于所有密集目的,他们似乎拥有相同的用户名,就好像管理用户登录到我的事件目录一样。

在这种情况下,用户拥有本地用户帐户而不是事件目录帐户,并且创建了一个欺骗性身份以故意绕过应用程序安全。

我假设有某种方法可以确定这是 Windows 本地用户帐户而不是 Active Directory 用户?我可以使用在 WindowsIdentity 中找到的用户名调用我的事件目录,并比较 SID 以确定这实际上是一个欺骗性的用户帐户,应该拒绝该用户访问。

这是执行此操作的正确方法吗?有什么方法可以让我从 WindowsIdentity 中得知它是由 我的 事件目录颁发的,并且这个身份没有被篡改过?

场景二

  1. 用户创建了一个与我的 Active Directory 同名的欺骗性 Active Directory 服务器,并创建了一个模拟与场景 1 中描述的本地用户相同过程的帐户。

现在我有一个具有相同域名和用户名的事件目录用户我为场景 1 建议的相同解决方案也可以解决此场景的问题,但再次确定未创建此 token 会很好只需检查 token 即可访问我的事件目录。

有人可以解决我遗漏的问题吗?或者我是否遗漏了什么?我是否应该只调用 Active Directory 来验证所提供的 WindowsIdentity 是否允许访问我的应用程序?

最佳答案

简单的回答:您的事件目录不仅仅由名称来标识。当您的计算机加入域时,它会交换一组凭据。欺骗事件目录或任何其他计算机比仅创建具有相同名称的计算机要困难得多。Windows 负责机器之间的所有幕后身份验证。除了错误和漏洞,您可以非常确定,当您调用 WindowsIdentity.GetCurrent() 时,会有一个不间断的推力链,由不同的凭据支持以验证用户身份。

更完整的答案:Windows 身份验证有两种类型:

  1. 第一种类型是网络中的对等方(即域外)。在这种情况下,当计算机 A 中的用户连接到计算机 B 时,它实际上使用的是 B 的本地用户。如果 B 中的用户恰好与 A 中的用户具有相同的名称和密码,则无需用户干预即可进行身份验证。如果不是,则出现登录屏幕,用户需要为 B 中的某些用户提供凭据。无论如何,用户实际上是在登录计算机 B,B 不需要信任或了解计算机 A 中的本地使用。
  2. 第二种类型是在域中。我相信如果计算机本身是域的一部分或与它有信任关系的域,则只能从域添加用户。在任何情况下,当计算机 B 将具有一组不同的凭据时,它允许它对域 Controller 进行身份验证。现在,当计算机 A 的用户想要登录计算机 B 时,要求域 Controller (它知道并信任)对用户进行身份验证。一旦它从域 Controller 获得 OK,用户就被接受。

Windows 支持各种身份验证协议(protocol),其中一些协议(protocol)比其他协议(protocol)更新、更可靠。网络管理员配置接受哪些协议(protocol)。大多数(全部?)协议(protocol)不涉及通过网络发送实际密码(查看 digest authentication 以获取此类协议(protocol)的示例或阅读 the old NTLM protocols )

关于c# - 如何验证 WindowsIdentity 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16007101/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com