代码之家  ›  专栏  ›  技术社区  ›  Adam Berent

WindowsIdentity.Impersonate和PostBack问题

  •  0
  • Adam Berent  · 技术社区  · 15 年前

    我正在写一个使用表单安全和活动目录的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);
                }
    

    问题是:

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

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

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

    请帮忙。

    1 回复  |  直到 15 年前
        1
  •  0
  •   ChrisWalshie    15 年前

    您将面临的问题是运行您的网站的应用程序池不受信任,因此无法模拟AD用户帐户。在AD中,需要手动允许对运行应用程序池的域用户进行委派。

    然后你就可以模仿用户了。