求助:
    现在用.NET做一个bs系统,客户要求和他们其他系统一样,都集成域用户登录,即:在系统中不用输入用户名,密码,通过windows域用户验证的客户即可登录系统。所以我在自己开发的系统中,对域用户和用户做了一个关联。现在需要实现的就是客户端通过IE浏览系统的时候,服务器端如何获取到客户端机器所在的域用户信息?在网上搜索了很多,效果不佳,望实现过的朋友给予帮助,谢谢!qq:254185950  

解决方案 »

  1.   

    获取当前域用户名:Page.User.Identity.Name你的站点需要集成WINDOWS认证
      

  2.   

    类似于SSO? 在继承FORM认证么。
    看这个行不行
    传送门
      

  3.   

    SSO这个也是实现的一个方式,不过我想如果实现了域用户集成的话,可能更方便点。
      

  4.   

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Runtime.InteropServices;   //必要引用
    using System.Security.Principal;    //必要引用
    /**//// <summary>
    /// UserLoginForDomain 的摘要说明
    /// 适用ASP.NET 2.0 
    /// Windows XP 调试成功
    /// 调用”advapi32.dll“win32 API
    /// </summary>namespace  UserLoginForDomain
    {
        public class UserLoginForDomainDAO
        {
            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);
            /**/
            /// <summary>
            /// 输入用户名、密码、登录域判断是否成功
            /// </summary>
            /// <example>
            /// if (impersonateValidUser(UserName, Domain, Password)){}
            /// </example>
            /// <param name="userName">账户名称,如:string UserName = UserNameTextBox.Text;</param>
            /// <param name="domain">要登录的域,如:string Domain   = DomainTextBox.Text;</param>
            /// <param name="password">账户密码, 如:string Password = PasswordTextBox.Text;</param>
            /// <returns>成功返回true,否则返回false</returns>
            public 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;
            }        public void undoImpersonation()
            {
                impersonationContext.Undo();
            }
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }    
     }
      可以用这个类判断用户名和密码是否是域用户的。
      

  5.   

    Page.User.Identity.Name 这个显示的不是客户端的域用户。一个非域成员的电脑登录后,显示的还是服务器的域信息
      

  6.   

    现在目的不是判断用户,密码是否正确。要实现的是:只要是域中的用户登录了计算机,通过IE访问系统,就可以直接登录。这时候系统需要进行判断,访问系统的这台客户端机器,是否是域中的【通过BS系统中用户和域信息的关联来进行判断】,是则进入系统,否则提示非域用户。
      

  7.   


    iis设置Windows访问,也需要输入用户名和密码的,很难拿到当前登录的用户名和密码来直接验证,还不如让客户自己输入一次。
      

  8.   

    这个恐怕不是Web程序的范畴吧
      

  9.   

    1、user.identity.name获得当前登陆名称。
    2、web.config中启用windows验证。
    3、拿到域中遍历看是否有此用户名(using System.DirectoryServices)。
    4、ie中安全设置-用户验证中填入自动获取用户名和密码(这个恐怕是LZ最想知道的)。
      

  10.   

      using System.DirectoryServices;/// <summary>
        /// APAC为域名
        /// </summary>
        /// <param name="usrId"></param>
        /// <param name="pwd"></param>
        /// <returns></returns>
        public static bool IsAPACUser(string usrId, string pwd) 
        {
            try
            {
                using (DirectoryEntry de = new DirectoryEntry())
                {
                    de.Path = "LDAP://APAC";
                    de.Username = "APAC\\" + usrId;
                    de.Password = pwd;
                    DirectorySearcher search = new DirectorySearcher(de);
                    search.Filter = "(SAMAccountName=" + usrId + ")";
                    search.PropertiesToLoad.Add("CN");
                    SearchResult r = search.FindOne();
                    if (r == null)
                    {
                        de.Close();
                        return false;                }
                    else
                    {
                        de.Close();
                        return true;
                    }
                }
            }
            catch (Exception ex)
            {
                return false;
            }
        } 
      

  11.   

            string LoginUser = Request.ServerVariables["LOGON_USER"];
            string[] LoginUserArr = LoginUser.Split('\\');
            //取用户ID
            string UserID = LoginUserArr[1];
            //取域名
            string DomainID = LoginUserArr[0];
            用取到用户ID跟系统表中的数据比较
    跟传统方式一样。不说了
      

  12.   

    方式一:
        输入域用户名跟密码 遍历域中是否有该用户
      using System.DirectoryServices;/// <summary>
      /// APAC为域名
      /// </summary>
      /// <param name="usrId"></param>
      /// <param name="pwd"></param>
      /// <returns></returns>
      public static bool IsAPACUser(string usrId, string pwd)  
      {
      try
      {
      using (DirectoryEntry de = new DirectoryEntry())
      {
      de.Path = "LDAP://APAC";
      de.Username = "APAC\\" + usrId;
      de.Password = pwd;
      DirectorySearcher search = new DirectorySearcher(de);
      search.Filter = "(SAMAccountName=" + usrId + ")";
      search.PropertiesToLoad.Add("CN");
      SearchResult r = search.FindOne();
      if (r == null)
      {
      de.Close();
      return false;  }
      else
      {
      de.Close();
      return true;
      }
      }
      }
      catch (Exception ex)
      {
      return false;
      }
      } 
    方式二:取域用户名,跟数据库中的用户表做比较       string LoginUser = Request.ServerVariables["LOGON_USER"];
            string[] LoginUserArr = LoginUser.Split('\\');
            //取用户ID
            string UserID = LoginUserArr[1];
            //取域名
            string DomainID = LoginUserArr[0];用取到用户ID跟系统表中的数据比较
    跟传统方式一样。不说了
      

  13.   

    我不是域中的计算机,访问页面的时候,将网站加入到信任站点,设置使用当前用户名,密码登陆。
    居然也可以访问页面,并且 string LoginUser = Request.ServerVariables["LOGON_USER"];得到的信息是域的信息【GOTOID\Adinistrator】,不知道为什么? 由于禁止了匿名访问,集成了windows访问,按道理,非域中的计算机,访问网站,应该弹出输入用户名,密码的窗体,是域中账户才可以访问到页面,否则页面提示无法访问等。
      

  14.   

    现在问题在于域中的计算机,我可以获得域名信息。
    而非域中的用户,通过这个 user.identity.name 也能返回信息,并且域名也是正常的。很疑惑
      

  15.   

    大侠们帮忙解决下。一台不在域中的计算机,访问IIS【配置为windows集成身份验证】,IE设置为【添加信任网站,自动使用用户名密码】,通过 user.identity.name 获取的到的信息,居然也是类似域中成员计算机访问的结果。 我要实现的是,非域中计算机通过user.identity.name获取不到信息或非域的信息,我就可以判断然后跳转到其他验证页面。谢谢
      

  16.   

    web.config中认证写windows
    你的IIS中那个认证那边选择windows集成认证你的代码中可以用page.user来得到登陆的用户
      

  17.   

    非域用户,访问 通过page.user得到的依旧是服务器模拟的域账户信息。