WindowsIdentity.Impersonate 和 PostBack 问题

Posted

技术标签:

【中文标题】WindowsIdentity.Impersonate 和 PostBack 问题【英文标题】:WindowsIdentity.Impersonate and PostBack issue 【发布时间】:2010-02-05 23:49:28 【问题描述】:

我正在编写一个使用 Forms 安全性和 Active Directory 的 ASP 网站。

我允许用户使用 Windows API 登录:

[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool LogonUser(string pszUsername, string pszDomain, string pszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

这给了我一个登录令牌指针,我将其保存在会话变量中:

bool returnValue = LogonUser(txtUserName.Text, domainName, txtPassword.Text, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref TokenHandle);

    if (!returnValue)
    
           lblErrorMessage.Text = "Incorrect Username or Password";
           lblErrorMessage.Visible = true;
            return;
    
    Session["TokenHandle"] = TokenHandle;

现在,当我被重定向回我的 Default.aspx 页面时,我想模拟已登录的用户。这样我不必硬编码 SQL 连接字符串用户名,我可以使用集成安全性。我在 页面加载 上执行此操作,如下所示:

if (Session["TokenHandle"] != null)
            
                IntPtr tokenHandle = new IntPtr(0);
                tokenHandle = (IntPtr)Session["TokenHandle"];
                WindowsIdentity.Impersonate(tokenHandle);
            

问题出在这里:

我第一次点击 Default.aspx 时一切正常,但是一旦我进行回发,它就会失去模拟并且出现错误:

用户“NT AUTHORITY\ANONYMOUS LOGON”登录失败。

现在我知道这段代码应该可以工作,我已经在其他项目中使用过它。我只是在这里遗漏了一些东西。

另外我正在使用 DevExpress.Web.ASPxGridView.v9.2 组件,我不确定它是否与它有关。

请帮忙。

【问题讨论】:

【参考方案1】:

您将遇到的问题是运行您网站的应用程序池不受委派信任,因此不能模拟 AD 用户帐户。在 AD 中,您需要手动允许委托给运行应用程序池的域用户。

然后你就可以冒充用户了。

【讨论】:

我不确定是不是这样。如果我删除所有 DevExpress 组件并用常规 ASP.NET 组件(gridview)替换它们,一切正常。它是导致它的 DevExpress。

以上是关于WindowsIdentity.Impersonate 和 PostBack 问题的主要内容,如果未能解决你的问题,请参考以下文章