我正在尝试在我的 WPF 客户端/服务器 (WCF) 应用程序中使用 Windows Identity Foundation 进行授权,该应用程序可能会或可能不会在与提供身份验证的活动目录相同的信任环境中运行。例如,认证可能由活动目录提供,但应用程序可能在云中运行,并且应用程序的用户配置文件角色/权限将由应用程序数据库提供。
为了完全理解我应该做什么,我觉得我在脑海中遗漏了 WIF 流程的一个基本部分:
- 用户使用 Active Directory 用户名/密码登录 Windows 域
- 用户打开我的应用程序。
- 我引用了登录用户的 WindowsIdentity,现在可以查看他们的登录令牌和所有配置的角色/声明 - 但就像他们可以登录域一样,他们可以登录到自己的机器并且仍然拥有 WindowsIdentity 令牌。
- 我可以将用户的 Windows 身份绑定到他们在我的数据库中的用户配置文件,并授予他们访问我的应用程序中他们的配置文件允许他们访问的特定功能的权限。
我缺少的部分是我有来自 WindowsIdentity.GetCurrent() 的这个 WindowsIdentity 实例......我如何验证是什么产生了这个?即它是本地机器用户还是活动目录用户,如果它是活动目录用户,我怎么知道它是我真正的活动目录服务器?
例如 - 几个场景:
方案 1
- 用户使用与我的活动目录域相同的名称来命名他们的本地计算机
- 用户在该计算机上创建一个本地用户,其用户名与他们知道存在于我的活动目录中的用户相同,该用户对我的应用程序具有完全管理访问权限。
- 他们登录到我的应用程序,并且出于所有密集目的,他们似乎具有相同的用户名,就好像管理用户登录到我的活动目录一样。
在这种情况下,用户有一个本地用户帐户,而不是 Active Directory 帐户,并且它有一个伪造的身份,旨在有目的地绕过应用程序安全性。
我假设有某种方法可以确定这是 Windows 本地用户帐户而不是 Active Directory 用户?我可以使用在 WindowsIdentity 中找到的用户名调用我的用户帐户的活动目录,并比较 SID 以确定这实际上是一个欺骗的用户帐户,并且应该拒绝用户访问。
这是正确的方法吗?有没有什么方法可以从 WindowsIdentity 中看出它是由我的活动目录发出的,并且这个身份没有被篡改?
方案 2
- 用户创建了一个与我的活动目录同名的欺骗活动目录服务器,并创建了一个模拟与场景 1 中描述的本地用户相同的过程的帐户。
现在我有一个具有相同域名和用户名的活动目录用户,我为方案 1 建议的相同解决方案也可以解决此方案的问题,但再次确定此令牌不是由我的活动创建的会很好目录只是通过检查令牌。
有人可以清除我缺少的东西 - 或者我是否缺少任何东西?我是否应该只调用 Active Directory 以验证提供的 WindowsIdentity 是否允许访问我的应用程序?