最近实现内部网域内的单点登录,搞得我焦头烂额,怎么读域信息,怎么获得用户信息,在那里获得,我都没有概念,只知道.net是MS做的,从自身角度分析,我不会给自己小鞋穿,从而得出:.net一定能实现这些。(对于我的无知,有点自嘲。。。)
域信息要靠AD(Active Directory 活动目录)服务器来获得,从而第一步就要搞明白AD是什么东东啦。结构是什么样的等等。这些东西了解一下框架就ok了,实现的时候能对上号就行。我花了一个半小时研究这个结构,差不多就能有个整体结构的认识。当然要想有更深的认识,还要继续钻研,在这里先没必要。。。
了解了AD的结构,然后呢,该怎么思考问题呢?
本人写这篇文章的主要目的不是介绍具体的技术(当然了,你肯定能从此文中获取解决问题的办法),而是想说一下解决问题的方法。一步一步的,对自己有帮助,可能对浏览到此文的读者也有用吧。。。呵呵,废话不说了,我们开始一步一步来了!
上文说到了解域结构,由于不是本文的重点,所以不去理,如果想了解其结构可以搞几本关于Windows 2003 AD 域配置的书看看。
搞软件的先要说明白需求,为了有目的的去寻求解决问题的答案,先总结一下需求:
1.实现一个局域网域内的登录功能:用户只要使用公司已加入域的计算机并且以在域内登录到计算机系统都能不用输入用户名密码直接访
问网站。
2.实现网站的sso(单点登录),如果用户已经在域内的一台计算机上以user1登录计算机并进入到网站系统,那么如果用户以相同的用户名在另外一台机器上也用user1登录到系统时,他会失败。
遇到问题就要解决,首先面对的是如何取得当前用户名和其所在域的困难,我不断search,并且尝试了数种server端的命令:
1.在ASP.NET中专用属性:
获取服务器电脑名:Page.Server.ManchineName
获取用户信息:Page.User
获取客户端电脑名:Page.Request.UserHostName
获取客户端电脑IP:Page.Request.UserHostAddress
2.在网络编程中的通用方法:
获取当前电脑名:static System.Net.Dns.GetHostName()
根据电脑名取出全部IP地址:static System.Net.Dns.Resolve(电脑名).AddressList
3.系统环境类的通用属性:
当前电脑名:static System.Environment.MachineName
当前电脑所属网域:static System.Environment.UserDomainName
当前电脑用户:static System.Environment.UserName
令人沮丧的是,这些没有一个可以解决问题的(也有可能是自己没有发现方法。。。各位兄台,如果有什么好的办法还请多多指教!谢了先!)
既然服务器端无法找到想要的信息,那直接从客户端着手总可以了吧,于是不停地找啊找,发现了以下几段代码(好开心啊!咔咔~):
<script language="JavaScript">
var WshNetwork = new ActiveXObject("WScript.Network");
alert("Domain = " + WshNetwork.UserDomain);
alert("Computer Name = " + WshNetwork.ComputerName);
alert("User Name = " + WshNetwork.UserName);
</script>
开始的时候很是开心,但是用起来以后。。。哎,又有问题了,不信大家可以试一下,如果直接把这段脚本复制到文本文件再修改文件名后缀为html的话,直接双击没问题,可以弹出三个对话框,但如果粘贴到aspx文件中的时候就不行了,出现了“activex安全提示”对话框,点yes之后,什么反应都没了,狂汗。。。于是又是很痛苦。。。又开始把免费的家教找出来(google),搜了一堆解决方法(说实在的,有点晕。。),大体做法就是:
1.打开浏览器
2.选择选项->internet选项->安全->选择Internet图标后点击自定义级别
3.把“对没有标记为安全的ActiveX控件进行初始化和脚本运行”设为“启用”
4.一路确定下去就ok了
我开开心心的有输入了那个都快要烂掉的网址(我自己在IIS上部署了刚才的aspx网页做测试)。。。等待。。。沉默。。。终于,还是那个错误!!!But why?!我还是请了“家教”但是没用,没有别的答案了,我这时想是不是刚才点错了,没点成启动啊??于是我又重新开始了上面四步:
1.打开浏览器
2.选择选项->internet选项->安全。。。。。发现有个本地Intranet,莫非是??于是这次没选Internet而是选了它。
3.把“对没有标记为安全的ActiveX控件进行初始化和脚本运行”设为“启用”
4.一路确定下去
5.重新输入那个烂网址
6.就在此时此刻,我是多么激动,搞定了!!!我高呼,太开心了。哈哈哈哈哈!
好了,我可以取得用户名和域名了,这时我可以开始做一个小的测试程序了,判断用户的身份和所在部门,其中用户的用户名和域名是通过javascript得到的,其他的就看server端的AD信息了,下面我展示一下我的程序:
1.默认访问页(Default.aspx)
<%@ Page Language="C#" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Untitled Page</title> <script language=javascript type="text/javascript"> function domainLogin() { var network = new ActiveXObject("WScript.Network"); var name = network.UserName; var domain = network.UserDomain; alert(name); alert(domain) document.getElementByIdx("HiddenField1").value = name; document.getElementByIdx("HiddenField2").value = domain; } </script> </head> <body> <form id="form1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server" /> <br /> <asp:DropDownList ID="DropDownList1" runat="server" Width="125px"> <asp:ListItem Value="IT">信息技术部</asp:ListItem> <asp:ListItem Value="Marketing">市场部</asp:ListItem> </asp:DropDownList> <asp:HiddenField ID="HiddenField1" runat="server" /> <br /> <asp:HiddenField ID="HiddenField2" runat="server" /> <br /> <div> <asp:Button ID="Button1" runat="server" Text="域登录" Width="126px" OnClick="Button1_Click" OnClientClick="domainLogin()" /></div> </form> </body> </html>
Default.aspx.cs文件
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.DirectoryServices; using System.DirectoryServices.Protocols; public partial class _Default : System.Web.UI.Page { String cn; String ou; protected void Page_Load(object sender, EventArgs e) { cn = HiddenField1.Value;//获取用户名 ou = DropDownList1.SelectedValue;//获取用户的部门(下拉框) } protected void Button1_Click(object sender, EventArgs e) { //判断是否在域中,如果在就等于123,不在就为null if (HiddenField2.Value == "123") { Boolean isExist = false; String ldap = "LDAP://123DC1/ou=" + ou + ",ou=Guangzhou,dc=123,dc=com"; DirectoryEntry de = new DirectoryEntry(); de.Path = ldap; de.Username = "shyman.zhang"; de.Password = "welcome"; String name2 = HiddenField1.Value.Replace('.', ' ').ToLower();//字符操作 foreach (DirectoryEntry child in de.Children) { //对于本部门的每个用户Entry进行遍历比较 String name3 = child.Name.ToLower().Substring(3); if (name3 == name2)//判断用户是否在这个部门 { isExist = true; break; } } if (isExist)//登录成功,转到MainPage.aspx { Response.Redirect("~/MainPage.aspx?name=" + HiddenField1.Value); } else//登录失败,转到Error.aspx Response.Redirect("~/Error.aspx?name=" + HiddenField1.Value+"&domain="+HiddenField2.Value); } else//不是域中成员 Response.Redirect("~/Error.aspx?name=" + HiddenField1.Value+"&domain=nodomain"); } }
Error.aspx.cs
using System; using System.Data; using System.Configuration; using System.Collections; 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; public partial class Error : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { String domain = Request.QueryString.Get("domain"); String name = Request.QueryString.Get("name"); if (domain == "123") { Response.Write("" + name + ",you login failt! <br> Make sure you selected the department right... </p>"); } else Response.Write("!!! " + name + ",you are not the employee of luckypai.<br>Go out!"); } }
MainPage.aspx.cs
using System; using System.Data; using System.Configuration; using System.Collections; 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; public partial class MainPage : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { String name = Request.QueryString.Get("name"); Response.Write("<p>Welcome "+name+" !</p>"); } }
到此,我们已经解决了用户信息的识别功能
转载于:https://www.cnblogs.com/talhon/p/4816827.html
今天的文章实现域登录(学习历程)[通俗易懂]分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/66087.html