
每个网站几乎都会有用户登录的模块,登录就会涉及到身份验证的过程。通常的做法是在页面上有个登录的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,然后注释掉里面的节点。
IIS目录安全性中不启用匿名访问,并且勾选集成windows身份验证。
登录页末尾调用LDAP验证方法,实现自动验证。
验证代码为:
public static string GetUserLoginName(HttpContext context)
{
if (context == null)
return null;
if(context.Request.IsAuthenticated==false)
returnnull;
DBLog.Debug(context.User.Identity.Nameis:+context.User.Identity.Name);
stringuserName=context.User.Identity.Name;
//此时userName的格式为:UserDomainName\LoginName
//我们只需要后面的LoginName就可以了。
string[]array=userName.Split(newchar[]{'\\'},StringSplitOptions.RemoveEmptyEntries);
if(array.Length==2)
returnarray[1];
DBLog.Debug(userNameis:+userName);
returnuserName;//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();
}
更新到生产环境时,发现生产环境不在同一个域里,因此没有成功。
但在测试环境中是可以成功实现的。