使用表单身份验证进行模拟

2024-02-24

我有一个 ASP.NET 站点,必须使用表单身份验证而不是 Windows 身份验证来访问ActiveDirectoryMembershipProvider。该站点必须使用表单,因为它们需要设计好的输入表单,而不是 Windows 身份验证使用的浏览器身份验证弹出窗口。

该站点需要模拟通过 Active Directory 登录的用户来访问用户特定的文件。

但是,那WindowsIdentity.GetCurrent()不一样HttpContext.Current.User.Identity虽然我的 web.config 包含:

<authentication mode="Forms">
    <forms loginUrl="login.aspx" timeout="480"/>
</authentication>
<identity impersonate="true" />

我无法使用LoginUser()WindowsIdentity.Impersonate()因为我需要冒充 AD 用户来获取他们的特定权限,并且我不知道用户的密码,因为 Forms 负责登录。

是否有可能从login.aspx.cs中获取System.Web.UI.WebControls.Login.Password,然后保存LoginUser()会话变量中的令牌WindowsIdentity.Impersonate()之后?或者也许是一种更安全的正确冒充方法?

我很困惑为什么表单身份验证不能自动<identity impersonate="true" />

我读过这个http://msdn.microsoft.com/en-us/library/ms998351.aspx http://msdn.microsoft.com/en-us/library/ms998351.aspx但它使用 Windows 身份验证。


可以使用表单身份验证来模拟用户。下面的代码确实有效.

The Visual Studio 杂志文章 http://visualstudiomagazine.com/articles/2004/05/01/activate-windows-impersonation-selectively.aspx罗伯特提到的是一个很好的资源。本文中的示例代码存在一些问题,因此我在下面包含了一些工作代码。

注意:如果您使用的是 Visual Studio,请确保启动它“以管理员身份运行" 以避免 UAC 阻止模拟的问题。

// in your login page (hook up to OnAuthenticate event)
protected void LoginControl_Authenticate(object sender, AuthenticateEventArgs e)
{
    int token;
    // replace "YOURDOMAIN" with your actual domain name
    e.Authenticated = LogonUser(LoginUser.UserName,"YOURDOMAIN",LoginUser.Password,8,0,out token);
    if (e.Authenticated) {
        Session.Add("principal", new WindowsPrincipal(new WindowsIdentity(new IntPtr(token))));
    }
}

[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword,
    int dwLogonType, int dwLogonProvider, out int TokenHandle);


// in global.asax.cs
void Application_PreRequestHandlerExecute(object send, EventArgs e)
{
    if (Thread.CurrentPrincipal.Identity.IsAuthenticated == true && HttpContext.Current.Session != null) {
        WindowsPrincipal windowsPrincipal = (WindowsPrincipal)Session["principal"];
        Session["principal"] = (GenericPrincipal)Thread.CurrentPrincipal;
        Thread.CurrentPrincipal = windowsPrincipal;
        HttpContext.Current.User = windowsPrincipal;
        HttpContext.Current.Items["identity"] = ((WindowsIdentity)windowsPrincipal.Identity).Impersonate();
    }
}

// in global.asax.cs
void Application_PostRequestHandlerExecute(object send, EventArgs e)
{
    if (HttpContext.Current.Session != null && Session["principal"] as GenericPrincipal != null) {
        GenericPrincipal genericPrincipal = (GenericPrincipal)Session["principal"];
        Session["principal"] = (WindowsPrincipal)Thread.CurrentPrincipal;
        Thread.CurrentPrincipal = genericPrincipal;
        HttpContext.Current.User = genericPrincipal;
        ((WindowsImpersonationContext)HttpContext.Current.Items["identity"]).Undo();
    }
}

// test that impersonation is working (add this and an Asp:Label to a test page)
protected void Page_Load(object sender, EventArgs e)
{
    try {
        // replace YOURSERVER and YOURDB with your actual server and database names
        string connstring = "data source=YOURSERVER;initial catalog=YOURDB;integrated security=True";
        using (SqlConnection conn = new SqlConnection(connstring)) {
            conn.Open();
            SqlCommand cmd = new SqlCommand("SELECT SUSER_NAME()", conn);
            using (SqlDataReader rdr = cmd.ExecuteReader()) {
                rdr.Read();
                Label1.Text = "SUSER_NAME() = " + rdr.GetString(0);
            }
        }
    }
    catch {
    }
}

Update:

你还应该处理Application_EndRequest,因为调用像Response.End()将绕过Application_PostRequestHandlerExecute.

另一个问题是 WindowsIdentity 可能会被垃圾收集,因此您应该根据每个请求的登录令牌创建一个新的 WindowsIdentity 和 WindowsPrincipal。

Update2:

我不知道为什么这会被否决,因为它有效。我添加了 pinvoke 签名和一些测试代码。再次,使用“启动 Visual Studio以管理员身份运行“。如果你不知道怎么做,谷歌一下如何做。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用表单身份验证进行模拟 的相关文章

  • Access / Word 2010 VBA 邮件合并尝试打开 [文件夹名称].mdb 而不是 ACCDB 源

    我们正在尝试从 Access 中自动执行邮件合并过程 单击按钮后 VBA 将运行指定当前数据库 accdb 作为数据源并运行 SQL 具体代码如下 Set up Word Dim objWord As Object Set objWord
  • 在哪里存储 Java 的 .properties 文件?

    The Java教程 http download oracle com javase tutorial essential environment properties htmlon using Properties 讨论如何使用 Prop
  • 在 GWT 中,在任何主机页标记上添加事件处理程序

    我想为任何标签添加 MouseOver 事件处理程序 举个例子 我想为旧版 HTML 页面中的每个锚点页面添加事件处理程序 继GWT指南 http code google com webtoolkit doc 1 6 DevGuideUse
  • ngmodel与Angular2中复选框的动态数组绑定

    我有一个 Angular 2 组件 其中我从数组生成复选框列表 现在我需要根据选中的复选框填充不同的数组 这应该是双向绑定 这意味着如果复选框的值已在数组中 则必须已经检查了复选框 我在 Angular 1 中使用了一个名为 checkli
  • 使用 crypt() 加密

    我目前正在做一个非常安全的登录系统 但我是 crypt 函数的新手 需要一些快速帮助 我在注册过程中使用 crypt 加密密码字符串并将其保存到数据库中 但是 我如何在登录过程中解密密钥 或者我应该怎么做 或者是否可以对提交的密码字符串进行
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在
  • 您可以使用关键字参数而不提供默认值吗?

    我习惯于在 Python 中使用这样的函数 方法定义 def my function arg1 None arg2 default do stuff here 如果我不供应arg1 or arg2 那么默认值None or default
  • Android ScrollView fillViewport 不工作

    我有一个简单的布局 名称位于顶部 按钮位于屏幕底部 或者超出该按钮 以防我添加更多项目 所以我使用带有 LinearLayout 的 ScrollView 如下所示
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • Typescript 函数接口重载

    我有以下代码 interface MySecondInterface a type A interface MyInterface val1 string val2 string MySecondInterface a
  • 带显示块的SPAN

    和默认有什么区别 div 元素和默认值 span 元素与display block HTML 元素的有效性和语义存在差异 否则它们是相同的 div and span两者都被定义为通用容器 在 HTML 方面没有更深层次的含义 一个默认为块显
  • 自定义 Visual Studio 2008 中的位置栏

    有人成功定制了 VS 2008 的 Places Bar 吗 我从 VS 2005 进行的自定义设置并没有转移到 2008 显然 并且无论我如何处理注册表 我都无法使我的自定义位置出现在 打开 对话框中 我已经阅读并应用了相关的MS KB文
  • 从 Azure 应用服务连接到 MongoDB Atlas 集群

    我在 Azure 上有一个 Web 应用程序 它连接到 Atlas cloud mongodb com 上托管的 MongoDB 集群 我想使用 Atlas 这样我就不必关心 MongoDb 配置 问题是我的集群连接超时 我必须在我的 mo
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检
  • Android:如何检测手机设置中的语言已更改

    我如何检测我的手机语言是否已更改 例如 Facebook 应用程序将向我们宣布 please wait we preparing your language i used myString Locale getDefault getDisp
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创
  • 保存符号方程以供以后使用?

    From here http www mathworks com help releases R2011a toolbox symbolic brvfu8o 1 html brvfxem 1 我正在尝试求解这样的符号方程组 syms x y
  • android ndk 硬件调试内存

    背景 我对 C 很有经验 对 Android 和 Java 还很陌生 但这是编程的环境问题 我已经用 ANSI C 开发了一个管理应用程序 可以移植到任何操作系统 只需在依赖于操作系统的代码中添加 UI 即可 它使用相当多的内存 特别是对于

随机推荐

  • 我们来为python的numpy做一个N维像素分箱/分桶的参考实现

    我经常想要像素仓 像素桶 https en wikipedia org wiki Data binning一个 numpy 数组 意思是 替换组N具有单个像素的连续像素 它是各个像素的总和N替换的像素 例如 从以下值开始 x np arra
  • XPath/XSLT 删除空标签

    我想删除仅包含空格 换行符 制表符的标签 如下所示 p p 您将如何使用 xpath 函数和 xslt 模板来做到这一点 这种转变 覆盖身份规则 http dpawson co uk xsl sect2 identity html
  • 如何在FOP中操作页码?

    我正在使用 Apache FOP 0 95 我只想将当前页码加 1 因此 在第 12 页上 我想显示 12 13 当然 第 13 页上什么也没有 我有什么想法可以做到这一点 也许通过操纵
  • ASCII 中的双引号

    双引号的 ASCII 码是多少 另外 是否有任何地方的列表链接 最后 如何将其纳入C家族 尤其是C 引号的 ASCII 代码是 34 有很多ASCII 表 http www google com search q ascii table在网
  • 如果使用 SAML 身份提供商配置用户池,Cognito 用户池自定义属性不会显示在 ID 令牌中

    根据文档 Cognito 在用户身份验证时创建的 ID 令牌 JWT 令牌 还应该包含为用户的用户池定义的自定义属性 看来 当用户池配置了 SAML 身份提供程序时 ID 令牌不包含用户池的那些自定义属性 而仅包含从 SAML 令牌映射的
  • (iPhone)当仪器显示“所有分配”只有 7MB 时,我的应用程序收到内存警告?

    正如问题所说 它在 7mb 时就死掉了 这是正常的吗 7MB 仪器显示无泄漏 谢谢 EDIT 已编辑 17mb gt 7mb 我通过删除分配的不必要的池来降低内存使用量 尽管如此 它还是在 7 MB 时收到内存警告 我本质上是在创建图像并在
  • C:“未定义类型‘struct X’的无效使用和取消引用指向不完整类型的指针”错误

    我几天来一直在仔细研究与我类似的问题 但仍然没有找到解决方案 感谢任何帮助 我有两个文件 一个包含处理有理数的方法 另一个包含处理二维数组的方法 我的问题是matrix c 无法识别fraction c 中包含的分数结构 我相信我的问题在某
  • 如何解决Prototype与DatePicker或Tooltip之间的jQuery冲突?

    我的后端应用程序有问题 我的表单中有数据字段 我正在使用插件 jQuery DataPicker 起初它工作正常 当我单击字段日历框时会弹出 问题是 当我实际选择任何日期时 日历和日期字段都会消失 我在开发人员工具 或 Firebug 中检
  • 无法启动 Apache:无效命令“SSLCipherSuite”

    我正在尝试让 SSL 与 WampServer 一起工作 我正在跟进这个答案 https stackoverflow com a 25095344 667903 然后我进入以下部分 Now test your Apache installa
  • Express (node.js) 中的多个视图路径

    我正在写一个 CMSNode js 与 Express 框架 在我的 CMS 上 我有几个用于用户 页面等的模块 我希望每个模块都有他的文件单独的文件夹 包括视图文件 有人知道我怎样才能实现这一目标吗 我在用着swig作为我的模板引擎 但如
  • 汇编中的 MUL 函数

    我正在尝试在汇编中执行简单的乘法 但是 当MUL函数被调用 mov bx 5 mov cx 10 mul cx 这些被称为指示 并且他们指定运营由处理器执行 mov是一个助记符move 同时mul是一个助记符mul尖利的 其他常见指令包括a
  • 如何使用 JGit 找到分支的第一次提交?

    我想使用 Eclipse 的 JGit 库找到特定分支的第一个提交 例如 如果我有 master a c d e feature b f g h another j k l findBranchRoot is the magic metho
  • 在地图中的 GroupedObservable 上使用订阅

    我有一个如下所示的对象数组 private questions Question title category Technologie answer title category Technologie answer title categ
  • 使用 libvlc 和 Qt 播放多个视频

    我在 Qt 中创建了一个示例应用程序 我必须在 2x2 网格中显示相机流 我正在使用 libvlc 来播放流 并且也能够显示视频 但我面临几个问题 Vlc 正在创建一个单独的窗口来渲染视频 它不显示在Qt应用程序提供的区域上 这是我的代码
  • 使用 cocoapods 时,更改 PRODUCT_NAME 的最佳方法是什么?

    我创建了一个名为 ABC 的应用程序 几个月后 我决定将名称更改为 ABCD 我相信我改变它的方式是在我的 Podfile 中 我改变了target ABC do to target ABCD do 然而 我记得后来在我的工作空间中遇到了很
  • iPhone 应用程序的生命周期是怎样的? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • sql server:获取列的默认值

    我执行一个选择来获取表的结构 我想获取有关列的信息 例如其名称 是否为空或是否为主键 我做这样的事情 sys columns c c precision c scale c is nullable as isnullable c defau
  • 如何获取 JAX-WS 响应 HTTP 状态代码

    调用 JAX WS 端点时 如何获取 HTTP 响应代码 在下面的示例代码中 当调用 Web 服务时port getCustomer customerID 可能会抛出异常 例如401 or 500 在这种情况下 如何从 HTTP 响应中获取
  • Javascript正则表达式对象和美元符号[重复]

    这个问题在这里已经有答案了 在下面的代码中 我期望是真的 但我却变得错误 我缺少什么 var text Sentence confirmationlink fooo alert placeHolderExists text confirma
  • 使用表单身份验证进行模拟

    我有一个 ASP NET 站点 必须使用表单身份验证而不是 Windows 身份验证来访问ActiveDirectoryMembershipProvider 该站点必须使用表单 因为它们需要设计好的输入表单 而不是 Windows 身份验证