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

相关的核心代码如下:

 #region public BaseUserInfo LogOnByUserName(string taskId, BaseUserInfo userInfo, string userName)
/// <summary>
/// 按用户名登录(LDAP专用)
/// </summary>
/// <param name="userInfo">用户</param>
/// <param name="userName">用户名</param>
/// <param name="statusCode">返回状态码</param>
/// <param name="statusMessage">返回状消息</param>
/// <returns>用户实体</returns>
public UserLogOnResult LogOnByUserName(string taskId, BaseUserInfo userInfo, string userName)
{
UserLogOnResult result = new UserLogOnResult();
var parameter = ServiceInfo.Create(taskId, userInfo, MethodBase.GetCurrentMethod());
ServiceUtil.ProcessUserCenterWriteDb(userInfo,parameter, (dbHelper) =>
{
// 先侦测是否在线
//userLogOnManager.CheckOnLine();
// 然后获取用户密码
var userManager = new BaseUserManager(userInfo);
// 是否从角色判断管理员
userManager.CheckIsAdministrator = true;
//根据用户名获取用户信息
BaseUserEntity userEntity = userManager.GetByUserName(userName); if (userEntity != null)
{
var baseUserLogOnManager = new BaseUserLogOnManager(userInfo);
//获取密码
BaseUserLogOnEntity userLogOnEntity = baseUserLogOnManager.GetObject(userEntity.Id);
//string password = userLogOnEntity.UserPassword;
string openId = 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());
});
return result;
}
#endregion

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

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

 /// <summary>
/// LDAP用户的登录操作
/// </summary>
private void LDAPUserLogOn(string userName, string password)
{
string lDAP = "LDAP://DC=CORP,DC=yourdomain,DC=com";
string domain = "corpwaiglobal";
string checkInput = string.Empty;
try
{
string statusCode = string.Empty;
string statusMessage = string.Empty;
// 有什么权限的人才可以登录到系统
string permissionCode = string.Empty;
// permissionItemCode = "Project.Admin.Access";
// 登录验证
string openId = Utilities.GetOpenId();
BaseUserInfo userInfo = Utilities.LogOnByLDAP(domain, lDAP, userName, password, openId, permissionCode, this.chkPersistCookie.Checked, false, out statusCode, out statusMessage);
// 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('?') > )
{
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.Exception exception)
{
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

 

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

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

    原文地址:http://www.cuiwenyuan.com/shanghai/post/Windows-AD-Logon-Intergrated-into-Jirigala-GPM-DotNet-B ...

  2. 【坑】前后端分离开发中 跨域问题以及前台不带cookie的问题

    文章目录 前言 跨域问题 cookie问题 拦截器导致的跨域问题 后记 前言 场景一: 前台哒哒哒的点击页面,发送请求,但是后台服务器总是没有回应,后台接口虽打了断点,但是根本进不到断点处: 前端:我 ...

  3. python中用分别用selenium、requests库实现Windows认证登录

    最近在搞单位的项目,实现python自动化,结果在第一步就把我给拒之门外,查资料问大佬,问我们开发人员,从周一折腾到周五才搞定了 接下给大家分享一下 项目背景:我们系统是基于Windows平台实现的, ...

  4. Ldap实现AD域认证

    1.java Ldap基础类 package com.common; import java.io.FileInputStream; import java.io.IOException; impor ...

  5. 说一说Web开发中两种常用的分层架构及其对应的代码模型

    昨天妹子让我帮她解决个问题,本以为可以轻松搞定,但是打开他们项目的一瞬间,我头皮发麻.本身功能不多的一个小项目,解决方案里竟然有几十个类库.仅仅搞明白各个类库的作用,代码层次之间的引用关系就花了一个多 ...

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

    原文:https://blog.csdn.net/hhw199112/article/details/80234462 错误: 登录失败 该登陆名来自不受信任的域,不能与windows身份认证一起使用 ...

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

    代码参考博客: https://blog.csdn.net/weixin_37891479/article/details/79527641 在做学校的课设的时候,发现了安全的问题,就不怀好意的用户有 ...

  8. SANGFOR AC配置AD域单点登录(二)----AD域侧配置及单点登录认证、注销测试

    1.AD域侧配置 1)新建组策略并配置logon登录脚本,以实现用户开机登录域时,自动通过AC认证  AD域服务器"运行"输入gpmc.msc,打开组策略编辑器,如下图. 右建需要 ...

  9. SharePoint基于windows验证的如何通过组策略实现IE自动以当前域账号登录SP站点

    通过组策略实现IE自动以当前域账号登录SP站点 1. 在运行中运行MMC,启动"组策略对象编辑器". 如下图: 找到组策略如下图: 找到域 点右键编辑 找到如下图: 找到[计算机配 ...

随机推荐

  1. ECSHOP后台SQL查询提示错误 this sql May contain UPDATE,DELETE,TRUNCATE,ALTER,DROP,FLUSH,INSERT

    一).首先说一下错误现象:市面上流行的绝大部分ECSHOP模板,安装的时候都需要执行一段或几段SQL语句来修改数据结构或者初始化一些数据.大多数ECSHOP管理员为了省事,都会通过 “ECSHOP后台 ...

  2. 旧文—冬日感怀

    冬日感怀   下雪了,虽不大,可那雪花落在手上,融在心里,便泛起淡淡的温柔,因为这是冬日的馈赠啊,是上苍的礼物,是往昔记忆的灰烬化作天地间的精灵装点纷繁琐碎的世界.于是,透过汽车上雾气氤氲的玻璃窗,人 ...

  3. 尝试在tensorflow上运行facenet

    上一篇装好了tensorflow的运行环境,开始尝试运行一些实例代码,在github上找到了一个tensorflow实现的facenet的代码,还是遇到了很多坑! 坚持看完,有重要总结! 代码:htt ...

  4. CLR via C#深解笔记一 - CLR & C# 基础概念

    写在前言   .Net Framework并不是Win 32 API 和COM上的一个抽象层.   某种程度上,它是自己的操作系统,有自己的内存管理器,自己的安全系统,自己的文件加载器,自己的错误处理 ...

  5. Android那些事儿之LBS定位,实践测试lbs

    最近一朋友让我了解下安卓LBS获取位置信息,于是动手实践了一把.搜了一圈发现有篇博文可以参考:Android那些事儿之LBS定位,但是原文作者没有提供源码下载,于是动手实现了,现记录下来备忘,代码附在 ...

  6. CentOS 编译安装 mysql

    1.前期准备 1.1 环境说明: 操作系统: CentOS release 6.4 (Final) [查看命令 cat /etc/redhat-release ] mysql : mysql-5.6. ...

  7. vm导入后远程桌面无法登陆域账户

    以本地Admin账户登录,打开C:\Windows\System32\sysprep目录,运行sysprep.exe工具,勾选Generalize,点击OK.系统重启后对Windows重新初始化,生成 ...

  8. 常用的sql语句(找不同位数,找重复)

    1.SQL找不同位数 select length(aae135),count(1) from ac01 group by  length(aae135) ; ————————————————————— ...

  9. golang 图片处理,剪切,base64数据转换,文件存储

    本文主要介绍: 1. 图片文件的读写. 2. 图片在go缓存中如何与base64互相转换 3. 图片裁剪 本文中,为了方便查看,去掉所有错误判断 base64 -> file ddd, _ := ...

  10. c++ 模板元编程的一点体会

    趁着国庆长假快速翻了一遍传说中的.大名鼎鼎的 modern c++ design,钛合金狗眼顿时不保,已深深被其中各种模板奇技淫巧伤了身...论语言方面的深度,我看过的 c++ 书里大概只有 insi ...