添加AD验证(域身份验证)到现有网站

每个网站几乎都会有用户登录的模块,登录就会涉及到身份验证的过程。通常的做法是在页面上有个登录的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的格式为:UserDomainName\LoginName
            // 我们只需要后面的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

posted @ 2013-08-23 15:46  旋转木马的IT小窝  阅读(5519)  评论(2编辑  收藏  举报

回到顶部