C#开发中Windows域认证登录2016(扩展吉日嘎拉GPM系统V4.2)
2016-07-04 20:39
645 查看
2013年搞公司的OA时,为了统一用户登录,将WindowsAD的用户和OA的账号对接,OA用户名的规则就是使用WindowsAD的用户名,格式举例:Troy.Cui,原理就是先进行域服务器的认证,认证完毕使用自定义的函数根据用户名读取出OA的用户信息,然后读取出用户名和密码信息,最后使用获取到的用户名和密码进行正常的登录。当时的文章:《C#开发中Windows域认证登录2(扩展吉日嘎拉GPM系统)》,本周打算OA中开发在线培训的功能,也想借此机会升级一下底层的应用DotNet.Business和DotNet.Utilities,第一个要升级的项目就是这个Windows域账号登录。
升级涉及到的文件如下:
DotNet.Business\DataAccess\Manager.User\BaseUserManager.LogOn.LDAP.cs(新增)
DotNet.Business\Service\LogOnService.LDAP.cs
DotNet.Business\WebUtilities\Utilities.LogOn.LDAP.cs
DotNet.IService\ILogOnService.LDAP.cs-这个要将ILogOnService.cs接口写成partical(新增)
相关的核心代码如下:
大家可以看出来BaseUserEntityuserEntity=userManager.GetByUserName(userName);这个函数非常重要、但不能随便就调用,安全起见,仅限于集成登录时使用。
前台页面登录部分,其实您可以将自己公司的域信息写到Web.Config或者配置为BaseSystemInfo下的参数
此文首发博客园,个人博客地址:http://www.cuiwenyuan.com/shanghai/post/Windows-AD-Logon-Intergrated-with-Jirigala-GPM-DotNet-Business-2016.html
升级涉及到的文件如下:
DotNet.Business\DataAccess\Manager.User\BaseUserManager.LogOn.LDAP.cs(新增)
DotNet.Business\Service\LogOnService.LDAP.cs
DotNet.Business\WebUtilities\Utilities.LogOn.LDAP.cs
DotNet.IService\ILogOnService.LDAP.cs-这个要将ILogOnService.cs接口写成partical(新增)
相关的核心代码如下:
#regionpublicBaseUserInfoLogOnByUserName(stringtaskId,BaseUserInfouserInfo,stringuserName) ///<summary> ///按用户名登录(LDAP专用) ///</summary> ///<paramname="userInfo">用户</param> ///<paramname="userName">用户名</param> ///<paramname="statusCode">返回状态码</param> ///<paramname="statusMessage">返回状消息</param> ///<returns>用户实体</returns> publicUserLogOnResultLogOnByUserName(stringtaskId,BaseUserInfouserInfo,stringuserName) { UserLogOnResultresult=newUserLogOnResult(); varparameter=ServiceInfo.Create(taskId,userInfo,MethodBase.GetCurrentMethod()); ServiceUtil.ProcessUserCenterWriteDb(userInfo,parameter,(dbHelper)=> { //先侦测是否在线 //userLogOnManager.CheckOnLine(); //然后获取用户密码 varuserManager=newBaseUserManager(userInfo); //是否从角色判断管理员 userManager.CheckIsAdministrator=true; //根据用户名获取用户信息 BaseUserEntityuserEntity=userManager.GetByUserName(userName); if(userEntity!=null) { varbaseUserLogOnManager=newBaseUserLogOnManager(userInfo); //获取密码 BaseUserLogOnEntityuserLogOnEntity=baseUserLogOnManager.GetObject(userEntity.Id); //stringpassword=userLogOnEntity.UserPassword; stringopenId=userLogOnEntity.OpenId; //再进行登录 //result=userManager.LogOnByUserName(userName,password,null,false,"Base"); result=userManager.LogOnByOpenId(openId,string.Empty,string.Empty); } //登录时会自动记录进行日志记录,所以不需要进行重复日志记录 //BaseLogManager.Instance.Add(userInfo,this.serviceName,MethodBase.GetCurrentMethod()); }); returnresult; } #endregion
大家可以看出来BaseUserEntityuserEntity=userManager.GetByUserName(userName);这个函数非常重要、但不能随便就调用,安全起见,仅限于集成登录时使用。
前台页面登录部分,其实您可以将自己公司的域信息写到Web.Config或者配置为BaseSystemInfo下的参数
///<summary> ///LDAP用户的登录操作 ///</summary> privatevoidLDAPUserLogOn(stringuserName,stringpassword) { stringlDAP="LDAP://DC=CORP,DC=yourdomain,DC=com"; stringdomain="corpwaiglobal"; stringcheckInput=string.Empty; try { stringstatusCode=string.Empty; stringstatusMessage=string.Empty; //有什么权限的人才可以登录到系统 stringpermissionCode=string.Empty; //permissionItemCode="Project.Admin.Access"; //登录验证 stringopenId=Utilities.GetOpenId(); BaseUserInfouserInfo=Utilities.LogOnByLDAP(domain,lDAP,userName,password,openId,permissionCode,this.chkPersistCookie.Checked,false,outstatusCode,outstatusMessage); //txtVerifyCode.Text=string.Empty; //登录结果 if(userInfo!=null) { this.AfterLogOn(userInfo); //登录成功,重新定向到跳转的页面 //Page.Response.Redirect(this.ReturnURL); //若是单点登录,还需要把OpenId传递过去,这样在其他子网站里可以获取到OpenId,而不是用户名密码了,可以进行加密登录了 if(!string.IsNullOrEmpty(this.ReturnURL)&&!string.IsNullOrEmpty(userInfo.OpenId)) { if(this.ReturnURL.IndexOf('?')>0) { this.ReturnURL=this.ReturnURL+"&OpenId="+userInfo.OpenId; } else { this.ReturnURL=this.ReturnURL+"?OpenId="+userInfo.OpenId; } } Response.Redirect(this.ReturnURL,false); } else { //checkInput="<script>alert('提示信息:"+statusMessage+"');</script>"; checkInput="<script>alert('提示信息:请检查你的用户名和密码。');</script>"; Page.ClientScript.RegisterStartupScript(this.GetType(),"message",checkInput); this.txtUserName.Focus(); } } catch(System.Exceptionexception) { Page.Response.Write(exception.Message); checkInput="<script>alert('提示信息:登录失败,请重试。');</script>"; Page.ClientScript.RegisterStartupScript(this.GetType(),"message",checkInput); this.txtUserName.Focus(); } }
此文首发博客园,个人博客地址:http://www.cuiwenyuan.com/shanghai/post/Windows-AD-Logon-Intergrated-with-Jirigala-GPM-DotNet-Business-2016.html
相关文章推荐
- rpm 安装和卸载 rpm 查询
- 20160702如何做好一个创业团队的产品经理?
- PPM / PGM / PBM 图像文件格式
- 源码编译RPM包
- DPM学习
- NPM小结
- ES6转码ES5---gulp的使用
- 从P6 EPPM 8 R3 到P6 EPPM 16 R1 有哪些改变?
- 项目管理概述
- 互联网产品经理常用软件及工作平台
- 互联网产品经理常用软件及工作平台
- 产品思维之获得喜爱的生日礼物
- npm -g默认安装地址
- NPM 使用介绍
- P6 EPPM 16.1 安装和配置指南 1
- 2015伦敦深度学习峰会笔记:来自DeepMind、Clarifai等大神的分享
- NPM使用前设置和升级
- 制作2.7.25版本puppet yum源
- 【笔记】PMBOK第3章项目管理过程
- 【笔记】PMBOK第二章组织影响和项目生命周期