当前位置:编程学习 > C#/ASP.NET >>

老生常谈——如何获取客户端当前登录的用户名?

老问题了,可是一直悬而未解,也参考了网上流传的各种版本,都不行。。。
详细情况还是描述一下:

在公司局域网内(使用domain)的win server上有一web程序(仅供内部网络使用),现需要在用户在自己电脑上打开web页面时自动显示该用户的用户名,并进行相应操作——主要是方便用户不要输入域账号登录(客户强烈要求)。。。

该试的办法都试了,都不中意,故重发此题,望大师前来指教。。。 --------------------编程问答-------------------- 网页间传值
1.Response.Redirect("Success.aspx?UserName="+UserName);
用Request.QueryString[“UserName”]获取
2.Server.Transfer("Success.aspx?UserName="+UserName);
用Request.Form[“UserName”]获取
3.用Session或缓存
4.Cookie或本地配置文件
5.数据库建登录临时表,保存到数据库,返回guid
6.可以用cookie加密保存 读取 --------------------编程问答-------------------- 没说清楚是什么用户名,是windows登录用户名,还是你们自己系统的,如果是你们自己系统的,这就简单多了,随便你保存在哪都可以啊 --------------------编程问答-------------------- 域账号?AD环境是最简单的了...启用IIS Windows集成身份验证,配置Membership Provider为ActiveDirectoryMembershipProvider即可,几乎一句代码都不用写... --------------------编程问答-------------------- 打开页面使用
http://服务机器名:port/app
这样子的方式,不要用ip和FQDN。

登录方式 Windows Authentication + 允许所有
设置服务器的user group,让domain users都能登录服务器机器。

显示名字的地方使用HttpContext.Current.User来获得相应信息。 --------------------编程问答--------------------

  /// <summary>
        /// 判断是域登录还是输入登录
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            IPHostEntry myHost = Dns.GetHostEntry(Dns.GetHostName());
            string strDomin = myHost.HostName;//获得
            string strClient = System.Web.HttpContext.Current.User.Identity.Name.Trim();//BEYONDSOFT\zhanghui12;    //结果:BEYONDSOFT\[用户名]
            string[] ma_str = strClient.Split('\\');
            Trace.Warn("", strDomin);
            Trace.Warn("Client", strClient);
            if (ma_str[0] == "BEYONDSOFT" && Regex.IsMatch(strDomin, @".beyondsoft.com$"))
            {
                //获取客户端的域用户
                string User_Name = ma_str[1];
                WebMemberManage.BLL.BLLUser bllUser = new WebMemberManage.BLL.BLLUser();
                string User_ID = bllUser.GetUidByName(User_Name);
                Session["User_ID"] = User_ID;
                Session["User_Name"] = User_Name;
                Response.Redirect("Member/HomePage.aspx");
            }
            else
            {
                Response.Redirect("Login.aspx");
            }
        }


lz 试试 --------------------编程问答-------------------- 多谢各位高手支持,吾将会一一测试。。。 --------------------编程问答--------------------
引用 1 楼 hefeng_aspnet 的回复:
网页间传值
1.Response.Redirect("Success.aspx?UserName="+UserName);
用Request.QueryString[“UserName”]获取
2.Server.Transfer("Success.aspx?UserName="+UserName);
用Request.Form[“UserName”]获取
3.用Session或缓存
4……


+1 --------------------编程问答--------------------
引用 1 楼 hefeng_aspnet 的回复:
网页间传值
1.Response.Redirect("Success.aspx?UserName="+UserName);
用Request.QueryString[“UserName”]获取
2.Server.Transfer("Success.aspx?UserName="+UserName);
用Request.Form[“UserName”]获取
3.用Session或缓存
4……



谢谢支持,不过大师理解错了






引用 2 楼 bdmh 的回复:
没说清楚是什么用户名,是windows登录用户名,还是你们自己系统的,如果是你们自己系统的,这就简单多了,随便你保存在哪都可以啊


是取windows当前登录用户名,自己的系统 --------------------编程问答--------------------
引用 3 楼 vrhero 的回复:
域账号?AD环境是最简单的了...启用IIS Windows集成身份验证,配置Membership Provider为ActiveDirectoryMembershipProvider即可,几乎一句代码都不用写...


大师是高手,还望继续。。。


引用 4 楼 sunzongbao2007 的回复:
打开页面使用
http://服务机器名:port/app
这样子的方式,不要用ip和FQDN。

登录方式 Windows Authentication + 允许所有
设置服务器的user group,让domain users都能登录服务器机器。

显示名字的地方使用HttpContext.Current.User来获得相应信息。


大师,此法有难度,主要是用户方面。。。

--------------------编程问答--------------------
引用 5 楼 yanbuodiao 的回复:
C# code

  /// <summary>
        /// 判断是域登录还是输入登录
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object s……


大师,以下语句获取不到:类似 BEYONDSOFT\zhanghui12 的信息,因为它正是我提问的要实现的

PHostEntry myHost = Dns.GetHostEntry(Dns.GetHostName());
            string strDomin = myHost.HostName;//获得
            string strClient = System.Web.HttpContext.Current.User.Identity.Name.Trim();//BEYONDSOFT\zhanghui12;    //结果:BEYONDSOFT\[用户名]

--------------------编程问答-------------------- 1.在IIS中将访问方式更改为不允许匿名访问

2.在Web.config中将验证方式更改为

   <identity impersonate="true"/>

   <authentication mode="Windows" />

3.在源代码中使用

string username= Security.Principal.WindowsIdentity.GetCurrent().Name

string[] info = username.Split(new char[1] { '\\' }, StringSplitOptions.RemoveEmptyEntries);

 

Domain(域):info[0]

Name: info[1]


百度是大师啊`先百度GOOGLE --------------------编程问答--------------------
引用 11 楼 luluyy 的回复:
1.在IIS中将访问方式更改为不允许匿名访问

2.在Web.config中将验证方式更改为

  <identity impersonate="true"/>

  <authentication mode="Windows" />

3.在源代码中使用

string username= Security.Principal.WindowsIdentity.GetCurre……



高手,稍等,我试试先。。。 --------------------编程问答-------------------- 使用正规的单点登录方法来处理,不要临时凑一个“解决方案”。 --------------------编程问答--------------------
引用楼主 danceboy_520 的回复:
▪ 云计算时代对厂商的影响主要在...▪ 云存储解决方案架构的选择?▪ 云计算能让商业交易变得更透明...▪ 什么是MIC众核?▪ 虚拟机管理器(VMM)有哪些,它...
老问题了,可是一直悬而未解,也参考了网上流传的各种版本,都不行。。。
详细情况还是描述一下:

在公司局域网内(使用domain)的win server上有一web程序(仅供内部网络使用),现需要在用户在自己电脑上打开w……
该试的办法都试了,都不中意,故重发此题,望大师前来指教。。。


不中意的原因有很多,但是你没有说清楚。

如果我是系统管理员,最不中意地就是什么“输入域账号”的问题。我根本不希望这类软件使用什么“域帐号”,不使用这类东西当然也就谈不上需要输入它。

楼上有人说“设置网站用户登录验证为windows”。其实看你的问题,你早已经不允许人家匿名登录了,早已经使用这类登录方法了。正是这种东西造成了麻烦。 --------------------编程问答--------------------
引用 14 楼 sp1234 的回复:
不中意的原因有很多,但是你没有说清楚。

如果我是系统管理员,最不中意地就是什么“输入域账号”的问题。我根本不希望这类软件使用什么“域帐号”,不使用这类东西当然也就谈不上需要输入它。

楼上有人说“设置网站用户登录验证为windows”。其实看你的问题,你早已经不允许人家匿名登录了,早已经使用这类登录方法了。正是这种东西造成了麻烦。……



兄弟所言极是,我也不希望使用“域账号”等等。。。
但是用户需要在我们的系统上进行操作和管理,需要记录并判断用户信息,并且用户的级别权限都是使用域权限的。。。目前让用户自己输入账号和密码,我调用域验证,也是可以。但就是用户不愿意输入,想自动在打开系统时抓取用户的信息。。。 --------------------编程问答--------------------
引用 11 楼 luluyy 的回复:
1.在IIS中将访问方式更改为不允许匿名访问

2.在Web.config中将验证方式更改为

  <identity impersonate="true"/>

  <authentication mode="Windows" />

3.在源代码中使用

string username= Security.Principal.WindowsIdentity.GetCurre……



兄弟,你这种方法要弹框啊,我不要弹框的效果。。。 --------------------编程问答-------------------- 参考:
http://social.msdn.microsoft.com/Forums/zh-CN/295/thread/4f57c997-2789-4e98-be8e-6e418225c982 --------------------编程问答-------------------- 5L 那个应该可以用哦. --------------------编程问答-------------------- 就用Session不行吗 --------------------编程问答-------------------- Session --------------------编程问答--------------------
引用 17 楼 qianjin036a 的回复:
参考:
http://social.msdn.microsoft.com/Forums/zh-CN/295/thread/4f57c997-2789-4e98-be8e-6e418225c982


大师,该方法我也试过,还是不行啊 --------------------编程问答--------------------
引用 19 楼 xiongxyt2 的回复:
就用Session不行吗


引用 20 楼 hamber_bao 的回复:
Session


二位兄弟,session是不行的,

我要实现的效果是:用户使用浏览器打开系统首页,首页上会自动显示该用户的登录名(也就是登录当前系统的用户名) --------------------编程问答--------------------
引用 10 楼 danceboy_520 的回复:
引用 5 楼 yanbuodiao 的回复:
C# code

/// <summary>
/// 判断是域登录还是输入登录
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Page_Load(object s……


大师,以下语句获取不……

lz所谓的客户端在打开机器的时候是默认以域账户登录的么?

现在我的这个环境就是 大家打开机器的时候 都使用域账号登录的  我这个方法是可以得到域账户信息的…… --------------------编程问答--------------------
引用 23 楼 yanbuodiao 的回复:
引用 10 楼 danceboy_520 的回复:
引用 5 楼 yanbuodiao 的回复:
C# code

/// <summary>
/// 判断是域登录还是输入登录
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Page_Load……



多谢兄弟鼎力回复,你这种方法确实是可以在用户登录系统以后获取域用户信息,但是我还是有一疑问:
我的web程序需要在IIS上怎么配置呢? 我在IIS上禁掉了匿名用户,启用了windows用户验证,此时用户打开web程序时,首先会弹出一个框。。。 若启用匿名用户,就无法使用
string strClient = System.Web.HttpContext.Current.User.Identity.Name.Trim();//BEYONDSOFT\zhanghui12;    //结果:BEYONDSOFT\[用户名]
            string[] ma_str = strClient.Split('\\');。。。

因为 我使用 System.Web.HttpContext.Current.User.Identity.Name.Trim();获得的结果:是空,不是这种格式—— BEYONDSOFT\[用户名]。。。
所以,大师还请继续。。。

--------------------编程问答-------------------- --------------------编程问答-------------------- 如果弹出验证框,说明客户机没有加入域,或者IE没有启用自动登录(或者用了其它浏览器),缺省ie设置是这样的:

变通而且更合理的做法是,让用户第一次使用时登录一下,然后发一张长期有效的ticket(保存在cookie中)
--------------------编程问答--------------------
引用 26 楼 jshi123 的回复:
如果弹出验证框,说明客户机没有加入域,或者IE没有启用自动登录(或者用了其它浏览器),缺省ie设置是这样的:

变通而且更合理的做法是,让用户第一次使用时登录一下,然后发一张长期有效的ticket(保存在cookie中)


兄弟果然是同行中人,不过用户电脑是加入域的,也是使用IE打开程序的,IE设置也如你图所示,但还是会弹框。。。
长期ticket我倒是有用过,不过也还是有些问题,
其一:用户第一次登录后save cookie,第二次直接取cookie,此时若用户清掉cookie,第二次还是得登录;其二:多个用户在同一台电脑上登录,save的cookie会是最后一个的,应该也不是我们所期望的。。。 --------------------编程问答-------------------- 弹框的问题,你试试看把 服务器域名加入到 IE的“本地Intranet站点”列表里 --------------------编程问答-------------------- windows登录时,必须登录到域:

如果是自动登录的,你可以用whoami命令看下是用什么账号登录的,前面应该是域的名字 --------------------编程问答--------------------
引用 27 楼 danceboy_520 的回复:
引用 26 楼 jshi123 的回复:
如果弹出验证框,说明客户机没有加入域,或者IE没有启用自动登录(或者用了其它浏览器),缺省ie设置是这样的:

变通而且更合理的做法是,让用户第一次使用时登录一下,然后发一张长期有效的ticket(保存在cookie中)


兄弟果然是同行中人,不过用户电脑是加入域的,也是使用IE打开程序的,IE设置也如你图所示,但还是会弹框。。。
长期ti……


这样就的确难了……  有些环境变量 程序是无法监测的……  无能为力 
还有一点就是 关于你搭建好了  会弹出框的问题 
我的这个项目搭建好以后 偶尔也会弹出让输入域账户和密码的框  但仅仅是个别现象 个人怀疑跟具体的客户机环境有关系 

另:搭建的时候 仅仅需要windows验证,其它的验证都关闭

还有一点 就是在你的这个方法中加个判断 当获取域账户失败后直接转到登录页 让用户从那个入口进(防备域服务器挂掉后你的这个项目也挂了……) --------------------编程问答--------------------
引用 24 楼 danceboy_520 的回复:
引用 23 楼 yanbuodiao 的回复:
引用 10 楼 danceboy_520 的回复:
引用 5 楼 yanbuodiao 的回复:
C# code

/// <summary>
/// 判断是域登录还是输入登录
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
……

这个获得的结果应该是  域名+“/”+域账户 --------------------编程问答--------------------
引用 29 楼 jshi123 的回复:
windows登录时,必须登录到域:

如果是自动登录的,你可以用whoami命令看下是用什么账号登录的,前面应该是域的名字

这个是关键 --------------------编程问答--------------------

//获取当前已登陆到Windows操作系统的用户名
System.Environment.UserName;
--------------------编程问答--------------------

//获取当前用户关联的网络域名()
System.Environment.UserDomainName;
--------------------编程问答--------------------
引用 26 楼 jshi123 的回复:
如果弹出验证框,说明客户机没有加入域,或者IE没有启用自动登录(或者用了其它浏览器),缺省ie设置是这样的:

变通而且更合理的做法是,让用户第一次使用时登录一下,然后发一张长期有效的ticket(保存在cookie中)

正解 --------------------编程问答--------------------
引用 13 楼 sp1234 的回复:
使用正规的单点登录方法来处理,不要临时凑一个“解决方案”。


单点登录……

把单点登录的声明思想拿出来用一下就行了。
--------------------编程问答--------------------
引用 28 楼 chenhs 的回复:
弹框的问题,你试试看把 服务器域名加入到 IE的“本地Intranet站点”列表里


这个方法我试过,确实是可以的,但是用户众多,他们自己不会、也不愿意去设置的。。。
所以。。。 --------------------编程问答--------------------
引用 29 楼 jshi123 的回复:
windows登录时,必须登录到域:

如果是自动登录的,你可以用whoami命令看下是用什么账号登录的,前面应该是域的名字


使用whoami 确实是能获取到当前登录系统的用户信息,那我该怎么用到我的程序中呢?


引用 30 楼 yanbuodiao 的回复:
引用 27 楼 danceboy_520 的回复:
引用 26 楼 jshi123 的回复:
如果弹出验证框,说明客户机没有加入域,或者IE没有启用自动登录(或者用了其它浏览器),缺省ie设置是这样的:

变通而且更合理的做法是,让用户第一次使用时登录一下,然后发一张长期有效的ticket(保存在cookie中)


兄弟果然是同行中人,不过用户电脑是加入域的,也是使用IE打开程序的……



还有一点 就是在你的这个方法中加个判断 当获取域账户失败后直接转到登录页 让用户从那个入口进(防备域服务器挂掉后你的这个项目也挂了……)
这一点确实不错。。。


引用 33 楼 nrylovecjb 的回复:
C# code

//获取当前已登陆到Windows操作系统的用户名
System.Environment.UserName;



引用 34 楼 nrylovecjb 的回复:
C# code

//获取当前用户关联的网络域名()
System.Environment.UserDomainName;


上两句获取的都是服务器的信息,不是客户端的信息。。。 --------------------编程问答--------------------
引用 36 楼 sunzongbao2007 的回复:
引用 13 楼 sp1234 的回复:

使用正规的单点登录方法来处理,不要临时凑一个“解决方案”。


单点登录……

把单点登录的声明思想拿出来用一下就行了。


兄弟说的对,也许是时候研究一下SSO了。。。 --------------------编程问答-------------------- 通过组策略配置来把服务器加到域中计算机的Intranet站点
“计算机配置”-“管理模板”-“Windows组件”-“Internet Explorer”-“Internet控制面板”-“安全页”里面右边的“站点到区域分配列表”,Internat区域的编号值是1。
--------------------编程问答-------------------- session 绝对可以 屡试不爽 --------------------编程问答--------------------
引用 40 楼 jshi123 的回复:
通过组策略配置来把服务器加到域中计算机的Intranet站点
“计算机配置”-“管理模板”-“Windows组件”-“Internet Explorer”-“Internet控制面板”-“安全页”里面右边的“站点到区域分配列表”,Internat区域的编号值是1。


此法看起来好像不错,试试先。。。 --------------------编程问答--------------------
引用 41 楼 q198708wyp 的回复:
session 绝对可以 屡试不爽



兄弟:还请细述针对我实现的效果,用session的实现方式。。。 --------------------编程问答-------------------- 用 cookie????????????? --------------------编程问答-------------------- 兄弟们:还是不行啊,我把图发出来:

<br />

<br />

--------------------编程问答-------------------- 图共三张,请稍慢。。。 --------------------编程问答--------------------
引用 44 楼 yksyuan 的回复:
用 cookie?????????????


当用户清掉cookie后。。。 --------------------编程问答-------------------- 此问题确实是有待考究。。。 --------------------编程问答-------------------- 我也想知道,在IIS是匿名访问的情况下,能否获得客户端的域用户名 --------------------编程问答--------------------
引用 49 楼 tedy 的回复:
我也想知道,在IIS是匿名访问的情况下,能否获得客户端的域用户名


兄弟是同道之人啊。。。 --------------------编程问答-------------------- 那天无意试验 哈哈 lz可以看看是不是你的web.config中的验证模式是别的了?不是window,我试验了下如果这个验证不是window的我上面的那个东西确实是得不到的,如果lz还有其它办法网站入口的问题,就把那个验证模式搞成window的  我5楼的那段代码就解决问题了 --------------------编程问答--------------------
引用 51 楼 yanbuodiao 的回复:
那天无意试验 哈哈 lz可以看看是不是你的web.config中的验证模式是别的了?不是window,我试验了下如果这个验证不是window的我上面的那个东西确实是得不到的,如果lz还有其它办法网站入口的问题,就把那个验证模式搞成window的 我5楼的那段代码就解决问题了


不会吧?我的web.config 确实是windows验证的啊,详见下图:

--------------------编程问答-------------------- 敢问楼主,您的问题解决了吗? 小弟遇到同样的问题,期待赐教! --------------------编程问答--------------------
引用 52 楼  的回复:
引用 51 楼 yanbuodiao 的回复:
那天无意试验 哈哈 lz可以看看是不是你的web.config中的验证模式是别的了?不是window,我试验了下如果这个验证不是window的我上面的那个东西确实是得不到的,如果lz还有其它办法网站入口的问题,就把那个验证模式搞成window的 我5楼的那段代码就解决问题了


不会吧?我的web.config 确实是windows验证的啊……


我的是表单验证,那我改怎么解决呢?希望楼主能解答一下,本人不甚感激....
--------------------编程问答-------------------- 请问楼主,您的问题解决了吗? 小弟遇到同样的问题,期待赐教! --------------------编程问答-------------------- 请问楼主,您的问题解决了吗? 小弟遇到同样的问题,期待赐教!
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,