如何在声明未映射到 AD 帐户的情况下执行 WIF/声明模拟?

Posted

技术标签:

【中文标题】如何在声明未映射到 AD 帐户的情况下执行 WIF/声明模拟?【英文标题】:How do I perform WIF/claims impersonation without the claim being mapped to an AD account? 【发布时间】:2011-07-07 11:40:54 【问题描述】:

我需要在 SharePoint 2010 中为声明用户执行搜索模拟。为了把它放在上下文中,我想先说明我如何让它与 Windows 帐户一起使用,然后讨论 Claims / WIF。

Windows 帐户

我可以为“经典”Windows 集成身份验证用户执行此操作:

WindowsImpersonationContext wic = null;
try
  
    WindowsIdentity impersonatedUser = new WindowsIdentity("john.doe@mydomain");
    wic = impersonatedUser.Impersonate();

    // do impersonated work here...
    // in my case this is a SharePoint KeywordQuery

finally

    if (wic != null)
    
        wic.Undo();
    

要使上述操作生效,模拟帐户必须与当前用户位于同一域中,并且我必须确保应用程序池所有者是:

域中的域帐户具有 Windows 2003 或更高版本的“域功能级别” 在本地机器上具有“充当操作系统的一部分”权限 在本地机器上具有“身份验证后模拟客户端”权限

(注意:如果有人能弄清楚如何解决当前帐户必须与模拟帐户在同一个域中的问题,我会全力以赴。)

索赔帐户

我想对索赔/WIF 帐户做同样的事情。这些帐户不一定与 AD 帐户相关联(我需要假设它们不是)。

有没有办法告诉 STS 我想模拟一个特定的帐户,并让它为我提供该帐户的适当令牌?我不会知道我正在模拟的用户的密码。

引用SharePoint Brew 我必须处理我在 SharePoint Web 前端 (WFE) 上运行的代码,该前端通过 WCF 调用调用查询处理器。我希望 WCF 调用在模拟用户的上下文中。

WFE (Server1) 的搜索 Web 部件与服务应用程序代理对话。关联的搜索服务应用程序代理调用本地 STS 以获取用户的 SAML 令牌。收集 SAML 令牌后,搜索服务应用程序代理将通过 WCF 调用调用运行查询处理器的服务器。我将此服务器称为“服务器 2”。服务器 2 接收传入请求并根据其本地 STS 验证 SAML 令牌。验证后,服务器 2 连接到各种组件以收集、合并和安全修剪搜索结果。服务器 2 将修剪后的搜索结果发送回服务器 1,然后将其呈现给用户。

更多的研究使我转向查看ActAs 和OnBehalfOf。我相信我会想使用 OnBehalfOf,但我不确定两者都行得通。下面列出了我找到的一些参考资料。任何指导表示赞赏。

.NET Framework Developer Center - Act As vs. On BehalfOf Pablo M. Cibraro (aka Cibrax) blog - ActAs and OnBehalfOf support in WIF Programming Windows Identity Foundation(我有书)

【问题讨论】:

对您用于执行关键字查询搜索的代码有什么建议吗?我可以做一些帮助:) 【参考方案1】:

我花了几个月的时间试图解决这个问题,在与 Microsoft SharePoint 和 WIF 工程师一起工作了很长时间后,我得出结论,这是不可能的。看来这个问题基本上就是柯克所暗示的。使用声明创建模拟会话时(例如,创建 SPClaim 并转换为 SPUser),SharePoint 实际上并没有创建完全模拟的会话。创建的会话实际上只有对象模型才能理解。这意味着当您走出 Web 应用程序的边界并进入搜索时,您实际上是在执行双跳,因为您进入了另一个应用程序域/进程空间。

我试图做一些类似于 eppesuig 建议的事情,但无法让它发挥作用。 也许如果您编写了一个全新的 STS,可以生成 SharePoint 可以接受的受信任的声明令牌,那么您可以使用 ActAs 令牌解决此问题(SharePoint 绝对不会接受 OnBehalfOf 令牌)。然而,这样做的安全隐患相当令人担忧。理论上它应该可以工作,但让自定义 STS 和 SharePoint 混合/信任被证明超出了我的能力范围。不过,我很想看到其他人尝试一下。

【讨论】:

【参考方案2】:

据我了解,您不能直接使用除您之外的任何其他身份。如果你想使用像 OnBehalfOf 这样的功能,你需要一个能够处理委托的 STS。因此 STS 将检查您的身份,然后允许使用委派的身份。

【讨论】:

以上是关于如何在声明未映射到 AD 帐户的情况下执行 WIF/声明模拟?的主要内容,如果未能解决你的问题,请参考以下文章

MVC 5、WIF (System.IdentityModel) 和 ADFS 未实际进行身份验证,联合注销时出错

在 WCF/WIF 中,如何合并来自两个不同客户端的自定义 sts 令牌的声明

如何使用PowerShell解锁Azure AD用户帐户?

.NET (ADFS / WIF) 和 Java (Federation) 之间的属性如何映射

Azure AD 链接帐户和备用登录映射

如何将(声明)安全令牌传递给启用 WIF 的 WCF 服务?