0

フォーム セキュリティと Active Directory を使用する ASP Web サイトを作成しています。

ユーザーが 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 コンポーネントを使用していますが、それと関係があるかどうかはわかりません。

助けてください。

4

1 に答える 1

0

あなたが抱える問題は、あなたのウェブサイトを実行しているアプリケーションプールが委任に対して信頼されていないという事実です。したがって、ADユーザーアカウントを偽装することはできません。ADでは、アプリケーションプールを実行しているドメインユーザーへの委任を手動で許可する必要があります。

その後、ユーザーになりすますことができます。

于 2010-03-10T08:05:31.260 に答える