2

そのため、Windows Server 2003 と IIS 6 を実行している運用サーバーのコードに問題があります。

ローカルで正常に動作するドメイン アカウントを偽装しようとしています。

ただし、サーバー上にある場合、ユーザーを偽装する関数は失敗します。つまり、false を返します。

private bool impersonateValidUser(String userName, String domain, String password)
    {
        WindowsIdentity tempWindowsIdentity;
        IntPtr token = IntPtr.Zero;
        IntPtr tokenDuplicate = IntPtr.Zero;

        if (RevertToSelf())
        {
            if (LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token) != 0)
            {
                if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
                {
                    tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
                    impersonationContext = tempWindowsIdentity.Impersonate();
                    if (impersonationContext != null)
                    {
                        CloseHandle(token);
                        CloseHandle(tokenDuplicate);
                        return true;
                    }
                }
            }
        }
        if (token != IntPtr.Zero)
            CloseHandle(token);
        if (tokenDuplicate != IntPtr.Zero)
            CloseHandle(tokenDuplicate);
        return false;
    }

コードはクラッシュしないことに注意してください。false を返すだけです。誰かがこれを以前に経験したことがあり、私が何を見始めるべきかについて何か考えがありますか? ここでは IIS 構成が機能していると思いますが、これを引き起こしている小さな問題を見つけるのに数週間かかる可能性があります。

偽装しようとしているアカウントを使用してサーバーにドライブをマウントできるため、アカウントのユーザー/パスワードの組み合わせは問題なく、Windows エクスプローラーでの認証に使用できます。

4

1 に答える 1

0

私が覚えているのは、プロジェクトで同じ問題があり、偽装が統合モードで機能しないということです。その問題の解決策は、web.config に追加することでした。

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
</system.webServer>

ただし、この偽装は global.asax メソッドでは機能しません。

protected void Application_AuthenticateRequest(object sender, EventArgs e)
protected void Application_BeginRequest(object sender, EventArgs e)

これがどの ISS のバージョンか分からないので、これも役に立てば幸いです。

于 2013-04-30T08:13:43.467 に答える