<%@ Page Language="C#"%>
<%@ Import Namespace = "System.Web" %>
<%@ Import Namespace = "System.Web.Security" %>
<%@ Import Namespace = "System.Security.Principal" %>
<%@ Import Namespace = "System.Runtime.InteropServices" %>
<script runat=server>
public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_PROVIDER_DEFAULT = 0;
WindowsImpersonationContext impersonationContext;
[DllImport("advapi32.dll", CharSet=CharSet.Auto)]
public static extern int LogonUser(String lpszUserName,
                 String lpszDomain,
                 String lpszPassword,
                 int dwLogonType,
                 int dwLogonProvider,
                 ref IntPtr phToken);
[DllImport("advapi32.dll", CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError=true)]
public extern static int DuplicateToken(IntPtr hToken,
                 int impersonationLevel, 
                 ref IntPtr hNewToken);
public void Page_Load(Object s, EventArgs e)
{
  if(impersonateValidUser("username", "domain", "password"))
  {
   //Insert your code that runs under the security context of a specific user here.
   undoImpersonation();
  }
  else
  {
   //Your impersonation failed. Therefore, include a fail-safe mechanism here.
  }
}
private bool impersonateValidUser(String userName, String domain, String password)
{
  WindowsIdentity tempWindowsIdentity;
  IntPtr token = IntPtr.Zero;
  IntPtr tokenDuplicate = IntPtr.Zero;
  if(LogonUser(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)
      return true;
     else
      return false;
   }
   else
     return false;
  }
  else
   return false;
}
private void undoImpersonation()
{
   impersonationContext.Undo();
}
</script>
posted on 2008-11-24 18:00  杨发达  阅读(401)  评论(0编辑  收藏  举报