• 添加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的格式为: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

    每一天都是崭新的
  • 相关阅读:
    RCTF 2019 web
    php花式读取文件
    PHP审计基础
    《笼中鸟——精神病人的生存现状》观后的一点思考
    python一些小trick
    Appium+Python入门学习总结
    解决windows下 Python中 matplotlib 做图中文不显示的问题
    py3.5 telnet的实例(在远程机器上批量创建用户)
    关于pycharm的一个imoprt的随笔
    LookupError: unknown encoding: idna 的处理方法
  • 原文地址:https://www.cnblogs.com/dannywang/p/3277675.html
Copyright © 2020-2023  润新知