0

アプリケーションにフォーム認証を実装しようとしています。同時に、サーバーのファイルにアクセスするために oredr で、特権の高いアカウントを使用して偽装したいと考えています。私は次のコードを書きました:

<system.web>
    <compilation debug="true" targetFramework="4.0" />
  <authentication mode="Forms">
    <forms loginUrl="Login.aspx" timeout="30" defaultUrl="HomePage.aspx"           
    cookieless="AutoDetect">
      <credentials passwordFormat="Clear">
        <user name="user1" password="pass@123"/>
        <user name="user2" password="pass@123"/>
      </credentials>
    </forms>
  </authentication>
  <authorization>
    <deny users="?"/>
  </authorization>
  <identity impersonate="true" userName="domain\abcd" password="aaaa"/>
  </system.web>

なりすましが機能していないようです。フォーム認証で偽装を使用できませんでしたか?

4

2 に答える 2

0

偽装クラス:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Security;
using System.Security.Principal;
using System.Runtime.InteropServices;
using System.IO;
using System.Text;

using System.Web;

namespace [YourProgramName]  //You must change it
{
    public class Impersonate
    {

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

        [DllImport("kernel32.dll")]
        private static extern int FormatMessage(int dwFlags, string lpSource, int dwMessageId, int dwLanguageId,
                                                StringBuilder lpBuffer, int nSize, string[] Arguments);


        private const int LOGON32_LOGON_NETWORK_CLEARTEXT = 8;
        private const int LOGON32_PROVIDER_DEFAULT = 0;
        private const int FORMAT_MESSAGE_FROM_SYSTEM = 0x1000;

        private static WindowsImpersonationContext winImpersonationContext = null;

        public static void ImpersonateUser(string domain, string userName, string password)
        {

            //Benutzer einloggen
            int userToken = 0;

            bool loggedOn = (LogonUser(userName, domain, password, LOGON32_LOGON_NETWORK_CLEARTEXT,
                                        LOGON32_PROVIDER_DEFAULT, out userToken) != 0);

            if (loggedOn == false)
            {
                int apiError = Marshal.GetLastWin32Error();
                StringBuilder errorMessage = new StringBuilder(1024);
                FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, null, apiError, 0, errorMessage, 1024, null);
                throw new Exception(errorMessage.ToString());
            }

            WindowsIdentity identity = new WindowsIdentity((IntPtr)userToken);
            winImpersonationContext = identity.Impersonate();

        }

        public static void UndoImpersonation()
        {
            if (winImpersonationContext != null)
            {
                winImpersonationContext.Undo();
            }
        }

    }
}

あなたのプログラムでそれを使用してください:

Impersonate.ImpersonateUser("Domain", "Username", "UserPassword");

                     //Your Code as the new User

                Impersonate.UndoImpersonation();
于 2012-07-24T07:56:02.823 に答える
-1

フォーム認証には以下を使用します。

<forms loginUrl="Login.aspx" defaultUrl="HomePage.aspx" protection="Validation" timeout="30"/>
于 2012-07-18T14:06:37.780 に答える