通过表单身份验证从代码隐藏模拟用户

Posted

技术标签:

【中文标题】通过表单身份验证从代码隐藏模拟用户【英文标题】:Impersonate a User from Code Behind via Forms Authentication 【发布时间】:2010-06-28 12:55:59 【问题描述】:

使用表单身份验证时是否可以模拟用户?

问题是我想要一个用户的外部登录和一个仅使用集成 Windows 安全性的内部站点,并且需要模拟用户。

我环顾四周,发现 John 的回答 here 非常好,但我不太明白如何将它与我的 Forms 身份验证混合使用。

建议?


编辑

我想要一个 <asp:Login /> 控件,并且此控件将针对 Active Directory 进行身份验证,该 Active Directory 与我要在其上使用模拟的 Windows 机器具有相同的用户集。

我的问题是,我不明白如何使用提供给<asp:Login /> 控件的相同用户名和密码来模仿。

【问题讨论】:

引用的答案对我来说似乎很简单。你错过了什么?模拟意味着他们有一个 Windows 帐户,并且您正在使用此帐户进行身份验证(和模拟)。也许更多关于你期望它如何工作的细节会帮助我理解。 @tvanfosson,试着清理一下。 【参考方案1】:

为了使该解决方案发挥作用,您需要访问用户的 ID 和密码。我不相信您可以使用登录用户控件来获得它;您需要创建自己的登录表单并自己处理登录操作。将用户的 ID 和密码保存在会话中,最好保存在安全字符串中,一旦您通过身份验证,并且当您需要代表他们访问内部站点时,请使用引用示例中的 Impersonator 类使用凭据来模拟他们。

  using (var context = Impersonator.LogOn( username, password ))
  
      try
      
      ....
      
      finally
      
         context.Undo();
      
  

【讨论】:

我担心它必须是那样的。你知道有什么办法可以把整个网站变成“模仿”模式吗? @Filip - 我不认为模拟在表单身份验证中“开箱即用”,因为不能保证使用表单身份验证的 Windows 安全令牌。您真的需要模拟还是授权就足够了 - 即,授予运行内部站点的帐户足够的权限来代表每个用户执行操作,然后简单地告诉它应该为哪个用户工作。 @tvanfosson,不幸的是,委派是不够的。我们调用的底层系统将使用已登录的 Windows 用户,因此我们需要模拟该用户。我当然可以在所有电话中都使用上述模拟,但这仍然很麻烦.. @Filip - 我真的认为这是唯一的出路。每个线程都将潜在地处理许多用户。使其工作的唯一方法是让线程仅在代表用户执行某些工作时模拟用户。这可以针对整个请求完成,或者您可以构建一个模拟每个调用的服务层。哪个是最好的取决于其他情况 - 您可能希望以最低权限原则为指导,直到您需要更高性能的东西。 谢谢!再想一想,将 context.Undo() 放入 Impersonator 的析构函数中是否安全?

以上是关于通过表单身份验证从代码隐藏模拟用户的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 表单身份验证和 Active Directory 模拟

使用 ASP.NET 表单身份验证的用户模拟

自定义身份验证

混合模式联合身份验证和表单身份验证

Asp.net 委托

Symfony2 自定义身份验证:用户登录但未通过身份验证