WinAuth.cs
上传用户:xuelanruo
上传日期:2015-04-02
资源大小:163k
文件大小:2k
源码类别:

Ftp服务器

开发平台:

C#

  1. using System;
  2. using System.Runtime.InteropServices;
  3. using System.Security;
  4. using System.Security.Principal;
  5. namespace FtpServerLibrary
  6. {
  7. /// <summary>
  8. /// Classe prenant en charge l'authentification Windows
  9. /// </summary>
  10. public class WinAuth
  11. {
  12. //Importation des dll permettant l'authentification Windows
  13. [DllImport("advapi32.dll", SetLastError=true)]
  14. public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, 
  15. int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
  16. [DllImport("kernel32.dll", CharSet=CharSet.Auto)]
  17. private extern static bool CloseHandle(IntPtr handle);
  18. [DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
  19. private extern static bool DuplicateToken(IntPtr ExistingTokenHandle,int SECURITY_IMPERSONATION_LEVEL,ref IntPtr DuplicateTokenHandle);
  20. /// <summary>
  21. /// Cette m閠hode permet l'authentification de l'utilisateur, ainsi que le changement des droits
  22. /// et permissions en fonction de l'utilisateur pour le thread courrant
  23. /// </summary>
  24. /// <param name="userName">login</param>
  25. /// <param name="password">mot de passe</param>
  26. /// <returns>true si l'authentification a r閡ssi</returns>
  27. public static bool Auth(string userName,string password)
  28. {
  29. try
  30. {
  31. IntPtr tokenHandle = new IntPtr(0);  
  32. IntPtr dupeTokenHandle = new IntPtr(0);
  33. //Param鑤res des fonctions LogonUser et DuplicateToken
  34. const int LOGON32_PROVIDER_DEFAULT = 0;
  35. const int LOGON32_LOGON_INTERACTIVE = 2;
  36. const int SecurityImpersonation = 2;
  37. tokenHandle = IntPtr.Zero;
  38. dupeTokenHandle = IntPtr.Zero;
  39. // On appelle LogonUser pour avoir acc鑣 ?un token d'identit?
  40. if(!LogonUser(userName,"",password,LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,ref tokenHandle))
  41. {               
  42. return false;
  43. }
  44.         
  45. if(!DuplicateToken(tokenHandle, SecurityImpersonation, ref dupeTokenHandle))
  46. {
  47. CloseHandle(tokenHandle);  
  48. return false;
  49. }
  50. // A partir du token d'identit? on impersonalise le thread.
  51. WindowsIdentity newId = new WindowsIdentity(tokenHandle);
  52. WindowsImpersonationContext impersonatedUser = newId.Impersonate();
  53. }
  54. catch
  55. {
  56. return false;
  57. }
  58. return true;
  59. }
  60. }
  61. }