每个网站几乎都会有用户登录的模块,登录就会涉及到身份验证的过程。通常的做法是在页面上有个登录的Form,然后根据用户名和密码到数据库中去进行验证。
而验证后如何在网站的各个页面维持这种认证过的状态,有时需要自己去实现(通过cookie或者其他的方式)。
然而,asp.net提供了几种身份验证的机制,可以方便我们进行验证。其中常用的是Forms和Windows。目前的需求是在原有的系统上增加AD验证
目前系统的概况是:
1.服务器与客户端不在同一个域里。(测试服务器与客户端在同一个域中)
2.现有网站的身份认证使用的是Forms。
因此,通过查阅资料,发现要想实现自动AD验证,即加入域的用户只要打开网站的登录页,不需要任何输入就能自动登录到系统中去,需要将身份认证模式改为Windows。
通过逐步的尝试,总结一下我的操作步骤:
1.修改webconfig的验证节点为windows验证
<authentication mode="Forms"> <forms loginUrl="~/logon.aspx" name="ESSAuthForm" timeout="10" protection="All" path="/"> <credentials passwordFormat="MD5"> <user name="username" password="password"/> </credentials> </forms> </authentication>
这是原有的web.config中的配置节点,需要改为:<authentication mode="Windows">,然后注释掉里面的节点。
2. IIS目录安全性中不启用匿名访问,并且勾选集成windows身份验证。
3. 登录页末尾调用LDAP验证方法,实现自动验证。
验证代码为:
public static string GetUserLoginName(HttpContext context) { if (context == null) return null; if (context.Request.IsAuthenticated == false) return null; DBLog.Debug("context.User.Identity.Name is:" + context.User.Identity.Name); string userName = context.User.Identity.Name; // 此时userName的格式为:UserDomainNameLoginName // 我们只需要后面的LoginName就可以了。 string[] array = userName.Split(new char[] { '\' }, StringSplitOptions.RemoveEmptyEntries); if (array.Length == 2) return array[1]; DBLog.Debug("userName is:" + userName); return userName;//null; }
其原理是让IIS完成了AD验证并将验证结果放到了 context.User.Identity对象里。
这个方法返回了域账号的登录名,通过一张域账号登录名与原系统账号的登录名的对应关系表,可以查到原系统的登录名。调用相关的登录方法进行登录。
4.浏览器设置。
想要不让IE弹出用户名密码框,需要将地址加到本地Intranet中。
5.
由于原系统是采用Forms身份验证,退出时需要进行一些清理工作,需要调用清理相关的代码。因此,避免退出时候的资源清理异常,删掉了Ess.WebSite.dll中的Logout类中的page_load方法的 FormsAuthentication.SignOut()方法,同时将最后一个重定向语句由Response.Redirect(FormsAuthentication.LoginUrl,fasle)改为Response.Redirect("~/logon.aspx?logout=true",fasle),加个logout的参数目的是防止首页继续执行BeginLDAP()这个方法。
if (Request.QueryString["logout"] == null) { BeginLDAP(); }
更新到生产环境时,发现生产环境不在同一个域里,因此没有成功。
但在测试环境中是可以成功实现的。
参考资料:
http://www.cnblogs.com/fish-li/archive/2012/05/07/2486840.html
http://msdn.microsoft.com/zh-cn/library/ms180890
http://msdn.microsoft.com/zh-cn/library/ff647076.aspx