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