继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

quincyye
关注TA
已关注
手记 235
粉丝 168
获赞 3550

每个网站几乎都会有用户登录的模块,登录就会涉及到身份验证的过程。通常的做法是在页面上有个登录的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">,然后注释掉里面的节点。

  1. IIS目录安全性中不启用匿名访问,并且勾选集成windows身份验证。

  2. 登录页末尾调用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();
}

更新到生产环境时,发现生产环境不在同一个域里,因此没有成功。

但在测试环境中是可以成功实现的。

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP

热门评论

楼主,你好,能请问一下.net和java是怎么写在一个项目里面的么?

查看全部评论