您的位置:首页 > 产品设计 > 产品经理

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(新增)

相关的核心代码如下:

#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


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: