老生常谈——如何获取客户端当前登录的用户名?
老问题了,可是一直悬而未解,也参考了网上流传的各种版本,都不行。。。详细情况还是描述一下:
在公司局域网内(使用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 --------------------编程问答--------------------
谢谢支持,不过易做图理解错了
是取windows当前登录用户名,自己的系统 --------------------编程问答--------------------
易做图是高手,还望继续。。。
易做图,此法有难度,主要是用户方面。。。
--------------------编程问答--------------------
易做图,以下语句获取不到:类似 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 --------------------编程问答--------------------
高手,稍等,我试试先。。。 --------------------编程问答-------------------- 使用正规的单点登录方法来处理,不要临时凑一个“解决方案”。 --------------------编程问答--------------------
不中意的原因有很多,但是你没有说清楚。
如果我是系统管理员,最不中意地就是什么“输入域账号”的问题。我根本不希望这类软件使用什么“域帐号”,不使用这类东西当然也就谈不上需要输入它。
楼上有人说“设置网站用户登录验证为windows”。其实看你的问题,你早已经不允许人家匿名登录了,早已经使用这类登录方法了。正是这种东西造成了麻烦。 --------------------编程问答--------------------
兄弟所言极是,我也不希望使用“域账号”等等。。。
但是用户需要在我们的系统上进行操作和管理,需要记录并判断用户信息,并且用户的级别权限都是使用域权限的。。。目前让用户自己输入账号和密码,我调用域验证,也是可以。但就是用户不愿意输入,想自动在打开系统时抓取用户的信息。。。 --------------------编程问答--------------------
兄弟,你这种方法要弹框啊,我不要弹框的效果。。。 --------------------编程问答-------------------- 参考:
http://social.msdn.microsoft.com/Forums/zh-CN/295/thread/4f57c997-2789-4e98-be8e-6e418225c982 --------------------编程问答-------------------- 5L 那个应该可以用哦. --------------------编程问答-------------------- 就用Session不行吗 --------------------编程问答-------------------- Session --------------------编程问答--------------------
易做图,该方法我也试过,还是不行啊 --------------------编程问答--------------------
二位兄弟,session是不行的,
我要实现的效果是:用户使用浏览器打开系统首页,首页上会自动显示该用户的登录名(也就是登录当前系统的用户名) --------------------编程问答--------------------
lz所谓的客户端在打开机器的时候是默认以域账户登录的么?
现在我的这个环境就是 大家打开机器的时候 都使用域账号登录的 我这个方法是可以得到域账户信息的…… --------------------编程问答--------------------
多谢兄弟鼎力回复,你这种方法确实是可以在用户登录系统以后获取域用户信息,但是我还是有一疑问:
我的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中)
--------------------编程问答--------------------
兄弟果然是同行中人,不过用户电脑是加入域的,也是使用IE打开程序的,IE设置也如你图所示,但还是会弹框。。。
长期ticket我倒是有用过,不过也还是有些问题,
其一:用户第一次登录后save cookie,第二次直接取cookie,此时若用户清掉cookie,第二次还是得登录;其二:多个用户在同一台电脑上登录,save的cookie会是最后一个的,应该也不是我们所期望的。。。 --------------------编程问答-------------------- 弹框的问题,你试试看把 服务器域名加入到 IE的“本地Intranet站点”列表里 --------------------编程问答-------------------- windows登录时,必须登录到域:
如果是自动登录的,你可以用whoami命令看下是用什么账号登录的,前面应该是域的名字 --------------------编程问答--------------------
这样就的确难了…… 有些环境变量 程序是无法监测的…… 无能为力
还有一点就是 关于你搭建好了 会弹出框的问题
我的这个项目搭建好以后 偶尔也会弹出让输入域账户和密码的框 但仅仅是个别现象 个人怀疑跟具体的客户机环境有关系
另:搭建的时候 仅仅需要windows验证,其它的验证都关闭
还有一点 就是在你的这个方法中加个判断 当获取域账户失败后直接转到登录页 让用户从那个入口进(防备域服务器挂掉后你的这个项目也挂了……) --------------------编程问答--------------------
这个获得的结果应该是 域名+“/”+域账户 --------------------编程问答--------------------
这个是关键 --------------------编程问答--------------------
--------------------编程问答--------------------
//获取当前已登陆到Windows操作系统的用户名
System.Environment.UserName;
--------------------编程问答--------------------
//获取当前用户关联的网络域名()
System.Environment.UserDomainName;
正解 --------------------编程问答--------------------
单点登录……
把单点登录的声明思想拿出来用一下就行了。
--------------------编程问答--------------------
这个方法我试过,确实是可以的,但是用户众多,他们自己不会、也不愿意去设置的。。。
所以。。。 --------------------编程问答--------------------
使用whoami 确实是能获取到当前登录系统的用户信息,那我该怎么用到我的程序中呢?
还有一点 就是在你的这个方法中加个判断 当获取域账户失败后直接转到登录页 让用户从那个入口进(防备域服务器挂掉后你的这个项目也挂了……)
这一点确实不错。。。
上两句获取的都是服务器的信息,不是客户端的信息。。。 --------------------编程问答--------------------
兄弟说的对,也许是时候研究一下SSO了。。。 --------------------编程问答-------------------- 通过组策略配置来把服务器加到域中计算机的Intranet站点
“计算机配置”-“管理模板”-“Windows组件”-“Internet Explorer”-“Internet控制面板”-“安全页”里面右边的“站点到区域分配列表”,Internat区域的编号值是1。
--------------------编程问答-------------------- session 绝对可以 屡试不爽 --------------------编程问答--------------------
此法看起来好像不错,试试先。。。 --------------------编程问答--------------------
兄弟:还请细述针对我实现的效果,用session的实现方式。。。 --------------------编程问答-------------------- 用 cookie????????????? --------------------编程问答-------------------- 兄弟们:还是不行啊,我把图发出来:
<br />
<br />
--------------------编程问答-------------------- 图共三张,请稍慢。。。 --------------------编程问答--------------------
当用户清掉cookie后。。。 --------------------编程问答-------------------- 此问题确实是有待考究。。。 --------------------编程问答-------------------- 我也想知道,在IIS是匿名访问的情况下,能否获得客户端的域用户名 --------------------编程问答--------------------
兄弟是同道之人啊。。。 --------------------编程问答-------------------- 那天无意试验 哈哈 lz可以看看是不是你的web.config中的验证模式是别的了?不是window,我试验了下如果这个验证不是window的我上面的那个东西确实是得不到的,如果lz还有其它办法网站入口的问题,就把那个验证模式搞成window的 我5楼的那段代码就解决问题了 --------------------编程问答--------------------
不会吧?我的web.config 确实是windows验证的啊,详见下图:
--------------------编程问答-------------------- 敢问楼主,您的问题解决了吗? 小弟遇到同样的问题,期待赐教! --------------------编程问答--------------------
我的是表单验证,那我改怎么解决呢?希望楼主能解答一下,本人不甚感激....
--------------------编程问答-------------------- 请问楼主,您的问题解决了吗? 小弟遇到同样的问题,期待赐教! --------------------编程问答-------------------- 请问楼主,您的问题解决了吗? 小弟遇到同样的问题,期待赐教!
补充:.NET技术 , C#