C#开发中Windows域认证登录2016(扩展吉日嘎拉GPM系统V4.2)

2013年搞公司的OA时,为了统一用户登录,将Windows AD的用户和OA的账号对接,OA用户名的规则就是使用Windows AD的用户名,格式举例: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 (新增)

相关的核心代码如下:

 1 #region public BaseUserInfo LogOnByUserName(string taskId, BaseUserInfo userInfo, string userName)
 2         /// <summary>
 3         /// 按用户名登录(LDAP专用)
 4         /// </summary>
 5         /// <param name="userInfo">用户</param>
 6         /// <param name="userName">用户名</param>
 7         /// <param name="statusCode">返回状态码</param>
 8         /// <param name="statusMessage">返回状消息</param>
 9         /// <returns>用户实体</returns>
10         public UserLogOnResult LogOnByUserName(string taskId, BaseUserInfo userInfo, string userName)
11         {
12             UserLogOnResult result = new UserLogOnResult();
13             var parameter = ServiceInfo.Create(taskId, userInfo, MethodBase.GetCurrentMethod());
14             ServiceUtil.ProcessUserCenterWriteDb(userInfo,parameter, (dbHelper) =>
15             {
16                 // 先侦测是否在线
17                 //userLogOnManager.CheckOnLine();
18                 // 然后获取用户密码
19                 var userManager = new BaseUserManager(userInfo);
20                 // 是否从角色判断管理员
21                 userManager.CheckIsAdministrator = true;
22                 //根据用户名获取用户信息
23                 BaseUserEntity userEntity = userManager.GetByUserName(userName);
24
25                 if (userEntity != null)
26                 {
27                     var baseUserLogOnManager = new BaseUserLogOnManager(userInfo);
28                     //获取密码
29                     BaseUserLogOnEntity userLogOnEntity = baseUserLogOnManager.GetObject(userEntity.Id);
30                     //string password = userLogOnEntity.UserPassword;
31                     string openId = userLogOnEntity.OpenId;
32                     //再进行登录
33                     //result = userManager.LogOnByUserName(userName, password, null, false, "Base");
34                     result = userManager.LogOnByOpenId(openId, string.Empty, string.Empty);
35                 }
36                 // 登录时会自动记录进行日志记录,所以不需要进行重复日志记录
37                 // BaseLogManager.Instance.Add(userInfo, this.serviceName, MethodBase.GetCurrentMethod());
38             });
39             return result;
40         }
41         #endregion

大家可以看出来BaseUserEntity userEntity = userManager.GetByUserName(userName);这个函数非常重要、但不能随便就调用,安全起见,仅限于集成登录时使用。

前台页面登录部分,其实您可以将自己公司的域信息写到Web.Config或者配置为BaseSystemInfo下的参数

 1 /// <summary>
 2     /// LDAP用户的登录操作
 3     /// </summary>
 4     private void LDAPUserLogOn(string userName, string password)
 5     {
 6         string lDAP = "LDAP://DC=CORP,DC=yourdomain,DC=com";
 7         string domain = "corpwaiglobal";
 8         string checkInput = string.Empty;
 9         try
10         {
11             string statusCode = string.Empty;
12             string statusMessage = string.Empty;
13             // 有什么权限的人才可以登录到系统
14             string permissionCode = string.Empty;
15             // permissionItemCode = "Project.Admin.Access";
16             // 登录验证
17             string openId = Utilities.GetOpenId();
18             BaseUserInfo userInfo = Utilities.LogOnByLDAP(domain, lDAP, userName, password, openId, permissionCode, this.chkPersistCookie.Checked, false, out statusCode, out statusMessage);
19             // txtVerifyCode.Text = string.Empty;
20             // 登录结果
21             if (userInfo!=null)
22             {
23                 this.AfterLogOn(userInfo);
24                 // 登录成功,重新定向到跳转的页面
25                 // Page.Response.Redirect(this.ReturnURL);
26                 // 若是单点登录,还需要把OpenId传递过去,这样在其他子网站里可以获取到OpenId,而不是用户名密码了,可以进行加密登录了
27                 if (!string.IsNullOrEmpty(this.ReturnURL) && !string.IsNullOrEmpty(userInfo.OpenId))
28                 {
29                     if (this.ReturnURL.IndexOf(‘?‘) > 0)
30                     {
31                         this.ReturnURL = this.ReturnURL + "&OpenId=" + userInfo.OpenId;
32                     }
33                     else
34                     {
35                         this.ReturnURL = this.ReturnURL + "?OpenId=" + userInfo.OpenId;
36                     }
37                 }
38                 Response.Redirect(this.ReturnURL, false);
39             }
40             else
41             {
42                 //checkInput = "<script>alert(‘提示信息:" + statusMessage + "‘);</script>";
43                 checkInput = "<script>alert(‘提示信息:请检查你的用户名和密码。‘);</script>";
44                 Page.ClientScript.RegisterStartupScript(this.GetType(), "message", checkInput);
45                 this.txtUserName.Focus();
46             }
47         }
48         catch (System.Exception exception)
49         {
50             Page.Response.Write(exception.Message);
51             checkInput = "<script>alert(‘提示信息:登录失败,请重试。‘);</script>";
52             Page.ClientScript.RegisterStartupScript(this.GetType(), "message", checkInput);
53             this.txtUserName.Focus();
54         }
55     }

此文首发博客园,个人博客地址:http://www.cuiwenyuan.com/shanghai/post/Windows-AD-Logon-Intergrated-with-Jirigala-GPM-DotNet-Business-2016.html

 

时间: 2024-08-06 04:42:29

C#开发中Windows域认证登录2016(扩展吉日嘎拉GPM系统V4.2)的相关文章

CentOS7与Windows AD集成之二Windows域账户登录CentOS7

上一节我们已经成功将CentOS7加入到Windows域控当中,那么我们是否可以用Windows的域账号直接登录加入域中的CentOS7呢?首先,我们在Windows域控当中新建一个测试账号:sshuser001打开putty,输入CentOS7的IP地址,尝试登录一下 可以看到,Windows的域账号可以成功登录到CentOS7:br/>这里需要注意一下登录时用户名的格式:[email protected] CentOS7与Windows AD集成之二Windows域账户登录CentOS7 原

Web开发中的域问题:PageContext,Request,Session,ServletContext(Application)

Web开发中的四个域对象(范围由小到大): page(jsp有效)  request(一次请求) session(一次会话) application(当前web应用) page域指的是pageContext. request域指的是HttpServletRequest session 域指的是HTTPSession application 域指的是ServletContext 之所以他们是域对象,原因就是他们都内置了map集合,都有setAttribute getAttribute方法.而且他们

JAVA windows 域认证指南

实现方法: import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.ldap.InitialLdapContext; import javax.naming.ldap.LdapContext; public class LdapAuth { private String domain; private String lda

python中windows下ssh登录linux

http://world77.blog.51cto.com/414605/668107

Linux服务器安全之用户密钥认证登录(基于CentOS 7.0系统)

一. 密钥简介: 在Linux下,远程登录系统有两种认证方式:密码认证和密钥认证.密码认证方式是一种传统的安全策略.设置一个相对复杂的密码,对系统安全能起到一定的防护作用,但是也面临一些其他问题,例如密码暴力破解.密码泄露.密码丢失等,同时过于复杂的密码也会对运维工作造成一定的负担.密钥认证是一种新型的认证方式,公用密钥存储在远程服务器上,专用密钥保存在本地,当需要登录系统时,通过本地专用密钥和远程服务器的公用密钥进行配对认证,如果认证成功,就可以成功登录系统.这种认证方式避免了被暴力破解的危险

SVN分级授权部署手册 --Windows用户认证

http://wenku.baidu.com/view/a0a16ea34028915f804dc2f8.html 第一章 概述 当VisualSVN 2.7采用Windows用户认证或Windows域认证时,可以使用SVN分级授权工具对VisualSVN的授权功能进行扩展,实现SVN库的创建.分库的分级授权.SVN用户密码修改等.本手册主要描述Windows用户认证的配置方法,关于采用Windows域认证的配置方法请参考<SVN分级授权工具部署手册--Windows域认证>. 第二章 安装部

IIS 登录失败 该登陆名来自不受信任的域,不能与windows身份认证一起使用

原文:https://blog.csdn.net/hhw199112/article/details/80234462 错误: 登录失败 该登陆名来自不受信任的域,不能与windows身份认证一起使用 解决: 数据库连接字符串改为:integrated security=false 原因: integrated security=true表示可以在不知道数据库用户名和密码的情况下时,依然可以连接数据库, 如果integrated security=false,或者不写,表示一定要输入正确的数据库

C#开发的Windows服务安装时需要“设置服务登录”

C#开发的Windows服务在安装的过程中会弹出一个"设置服务登录"对话框,要求输入用户名和密码.此时用户名和密码的形式必须以域用户的形式输入,如果没有加入域,用户名要用.\username 的格式,否则会提示错误. 注:需要设置服务登录,是因为serviceProcessInstaller的Account设置为User了,修改为LocalService安装Windows服务就不需要设置账号密码了.

记录一下在SpringBoot中实现简单的登录认证

代码参考博客: https://blog.csdn.net/weixin_37891479/article/details/79527641 在做学校的课设的时候,发现了安全的问题,就不怀好意的用户有可能跳过登录直接访问系统的界面和使用里面的功能,于是想为系统加个安全验证.现在常用的安全框架我知道的就是Shiro还有SpringSecurity,但这次我不打算用框架,采用拦截器filter和session技术实现了一个基于session的登录认证. 先简单地说一下原理: session和cook