最简单好用的SSO - 能经得起几万并发用户的SSO 组件使用方法介绍
项目中使用了通用权限管理系统,该系统集成了单点登录功能,下面我来介绍下该单点登录实现的一些细节。
首先我们来看看其登录接口,系统本身支持各种登录方式:
1、公司名、用户名、密码
2、唯一账号、密码
3、手机号码、密码
5、Email、密码
接口已实现的部分功能:
C/S客户端登录还可以检测MAC地址,
B/S的可以对IP进行检查;
可在用户登录地址发生变化后进行手机验证后才能继续登录;
每次登陆都会记录登录日志;
。。。
另外,根据需要,可在登录接口扩展其它功能,我在项目中就增加了登录提醒功能,每次登陆都会发送提醒信息到用户的手机、微信或邮箱中。
登录后,会对应该用户生成一个OpenId,该OpenId是一个GUID,看看代码部分截图:
具体生成OPenId的地方,生成OpenID使用了一个线程,这样可加快登录接口的速度。
实现部分的功能代码
public void UpdateVisitDateTask(object param)
{
var tuple = param as Tuple<BaseUserLogOnEntity, bool, string>;
BaseUserLogOnEntity userLogOnEntity = tuple.Item1;
bool createOpenId = tuple.Item2;
string openId = tuple.Item3; // 2015-01-06 提高效率,写入缓存
if (BaseSystemInfo.UserCenterDbType == CurrentDbType.Oracle)
{
DotNet.Business.Utilities.SetUserOpenId(userLogOnEntity.Id, openId);
} string sqlQuery = string.Empty;
DateTime? openIdTimeout = DateTime.Now.AddHours(); IDbHelper dbHelper = DbHelperFactory.GetHelper(BaseSystemInfo.UserCenterDbType, BaseSystemInfo.UserCenterDbConnection);
// 是否更新访问日期信息
List<IDbDataParameter> dbParameters = new List<IDbDataParameter>(); // 若有一周没登录了,需要重新进行手机验证
bool mobileValiated = false;
if (userLogOnEntity.PreviousVisit.HasValue || userLogOnEntity.FirstVisit.HasValue)
{
TimeSpan ts = new System.TimeSpan();
if (userLogOnEntity.LastVisit.HasValue)
{
ts = DateTime.Now.Subtract((DateTime)userLogOnEntity.LastVisit);
mobileValiated = (ts.TotalDays > );
}
else if (userLogOnEntity.FirstVisit.HasValue)
{
ts = DateTime.Now.Subtract((DateTime)userLogOnEntity.FirstVisit);
mobileValiated = (ts.TotalDays > );
}
if (mobileValiated)
{
sqlQuery = " UPDATE " + BaseUserContactEntity.TableName
+ " SET " + BaseUserContactEntity.FieldMobileValiated + " = 0 "
+ " WHERE " + BaseUserContactEntity.FieldId + " = '" + userLogOnEntity.Id + "' AND " + BaseUserContactEntity.FieldMobileValiated + " = 1 ";
dbHelper.ExecuteNonQuery(sqlQuery);
}
} if (BaseSystemInfo.UpdateVisit)
{
// 第一次登录时间
if (userLogOnEntity.FirstVisit == null)
{
sqlQuery = " UPDATE " + BaseUserLogOnEntity.TableName
+ " SET " + BaseUserLogOnEntity.FieldPasswordErrorCount + " = 0 , "
+ " " + BaseUserLogOnEntity.FieldUserOnLine + " = 1 "
+ ", " + BaseUserLogOnEntity.FieldFirstVisit + " = " + dbHelper.GetDbNow()
+ ", " + BaseUserLogOnEntity.FieldIPAddress + " = '" + userLogOnEntity.IPAddress + "'"
+ ", " + BaseUserLogOnEntity.FieldIPAddressName + " = '" + userLogOnEntity.IPAddressName + "'"
+ ", " + BaseUserLogOnEntity.FieldMACAddress + " = '" + userLogOnEntity.MACAddress + "'"
+ ", " + BaseUserLogOnEntity.FieldSystemCode + " = " + dbHelper.GetParameter(BaseUserLogOnEntity.FieldSystemCode);
dbParameters.Add(dbHelper.MakeParameter(BaseUserLogOnEntity.FieldSystemCode, userLogOnEntity.SystemCode)); if (createOpenId)
{
sqlQuery += " , " + BaseUserLogOnEntity.FieldOpenId + " = '" + openId + "'";
sqlQuery += " , " + BaseUserLogOnEntity.FieldOpenIdTimeout + " = " + dbHelper.GetParameter(BaseUserLogOnEntity.FieldOpenIdTimeout);
dbParameters.Add(dbHelper.MakeParameter(BaseUserLogOnEntity.FieldOpenIdTimeout, openIdTimeout));
} sqlQuery = sqlQuery + " WHERE (" + BaseUserLogOnEntity.FieldId + " = '" + userLogOnEntity.Id + "') AND " + BaseUserLogOnEntity.FieldFirstVisit + " IS NULL";
dbHelper.ExecuteNonQuery(sqlQuery, dbParameters.ToArray());
}
else
{
// 最后一次登录时间
sqlQuery = " UPDATE " + BaseUserLogOnEntity.TableName
+ " SET " + BaseUserLogOnEntity.FieldPasswordErrorCount + " = 0 , "
+ BaseUserLogOnEntity.FieldPreviousVisit + " = " + BaseUserLogOnEntity.FieldLastVisit + " , "
+ BaseUserLogOnEntity.FieldUserOnLine + " = 1 , "
+ BaseUserLogOnEntity.FieldLastVisit + " = " + dbHelper.GetDbNow() + " , "
+ BaseUserLogOnEntity.FieldLogOnCount + " = " + BaseUserLogOnEntity.FieldLogOnCount + " + 1 "
+ ", " + BaseUserLogOnEntity.FieldSystemCode + " = " + dbHelper.GetParameter(BaseUserLogOnEntity.FieldSystemCode)
+ ", " + BaseUserLogOnEntity.FieldIPAddress + " = '" + userLogOnEntity.IPAddress + "'"
+ ", " + BaseUserLogOnEntity.FieldIPAddressName + " = '" + userLogOnEntity.IPAddressName + "'"
+ ", " + BaseUserLogOnEntity.FieldMACAddress + " = '" + userLogOnEntity.MACAddress + "'";
dbParameters.Add(dbHelper.MakeParameter(BaseUserLogOnEntity.FieldSystemCode, userLogOnEntity.SystemCode)); if (createOpenId)
{
sqlQuery += " , " + BaseUserLogOnEntity.FieldOpenId + " = '" + openId + "'";
sqlQuery += " , " + BaseUserLogOnEntity.FieldOpenIdTimeout + " = " + dbHelper.GetParameter(BaseUserLogOnEntity.FieldOpenIdTimeout);
dbParameters.Add(dbHelper.MakeParameter(BaseUserLogOnEntity.FieldOpenIdTimeout, openIdTimeout));
} sqlQuery += " WHERE (" + BaseUserLogOnEntity.FieldId + " = '" + userLogOnEntity.Id + "')";
dbHelper.ExecuteNonQuery(sqlQuery, dbParameters.ToArray());
}
}
else
{
// 实现单点登录功能,每次都更换Guid
if (createOpenId)
{
sqlQuery = " UPDATE " + BaseUserLogOnEntity.TableName
+ " SET " + BaseUserLogOnEntity.FieldPasswordErrorCount + " = 0 "
+ " , " + BaseUserLogOnEntity.FieldSystemCode + " = " + dbHelper.GetParameter(BaseUserLogOnEntity.FieldSystemCode)
+ " , " + BaseUserLogOnEntity.FieldOpenId + " = '" + openId + "'"
+ " , " + BaseUserLogOnEntity.FieldOpenIdTimeout + " = " + dbHelper.GetParameter(BaseUserLogOnEntity.FieldOpenIdTimeout)
+ " WHERE (" + BaseUserLogOnEntity.FieldId + " = " + userLogOnEntity.Id + ")";
// sqlQuery += " AND " + BaseUserEntity.FieldOpenId + " IS NULL ";
dbParameters.Add(dbHelper.MakeParameter(BaseUserLogOnEntity.FieldSystemCode, userLogOnEntity.SystemCode));
dbParameters.Add(dbHelper.MakeParameter(BaseUserLogOnEntity.FieldOpenIdTimeout, openIdTimeout)); dbHelper.ExecuteNonQuery(sqlQuery, dbParameters.ToArray());
}
}
}
以上是登录部分功能的实现,其它系统登录时,根据OpenId进行登录。那么这里的Openid怎么调用呢?
如果是C/s系统,Openid是可以直接获取到的。在访问子系统时带上该OpenId,子系统再通过OpenId登录接口实现登录。
如果是B/S系统,有另外的实现方法,可在系统功能中找到。
下图是其它系通过通过OpenId登录的功能截图
aaarticlea/png;base64,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" alt="" />
Utilities.LogOnByOpenId(openId, true)
是通用权限管理系统底层已经实现好的方法,子系统直接调用DLL即可。 以上是通用权限系统实现的单点登录功能介绍,主要是通过OpenId进行的,可根据具体业务场景进行扩展,
对于此种方法实现的单点登录功能,大家有什么建议,欢迎交流。
最简单好用的SSO - 能经得起几万并发用户的SSO 组件使用方法介绍的更多相关文章
- 一个简单的适用于Vue的下拉刷新,触底加载组件
一个简单的适用于Vue的上拉刷新,触底加载组件,没有发布npm需要时直接粘贴定制修改即可 <template> <div class="list-warp-template ...
- SSO 基于Cookie+fliter实现单点登录(SSO):工作原理
SSO的概念: 单点登录SSO(Single Sign-On)是身份管理中的一部分. SSO的一种较为通俗的定义是:SSO是指訪问同一server不同应用中的受保护资源的同一用户,仅仅须要登录一次,即 ...
- ASP.net中导出Excel的简单方法介绍
下面介绍一种ASP.net中导出Excel的简单方法 先上代码:前台代码如下(这是自己项目里面写的一点代码先贴出来吧) <div id="export" runat=&quo ...
- 简单制作 OS X Yosemite 10.10 正式版U盘USB启动安装盘方法教程 (全新安装 Mac 系统)
原文地址: http://www.iplaysoft.com/osx-yosemite.html 简单制作 Mac OS X Yosemite 正式版 USB 启动盘的方法教程: 其实制作 OS X ...
- 简单的利用JS来判断页面是在手机端还是在PC端打开的方法
在移动设备应用越来越广泛的今天,许多网站都开始做移动端的界面展示,两者屏幕尺寸差异很大,所以展示的内容也有所差别.于是就遇到一个问题,如何判断你的页面是在移动端还是在PC端打开的,很简单的问题,那我们 ...
- 安卓开发学习笔记(五):史上最简单且华丽地实现Android Stutio当中Webview控件https/http协议的方法
一.我们先在XML当中自定义一个webview(Second_layout.xml) 代码如下: <?xml version="1.0" encoding="utf ...
- (转)《SSO CAS单点系列》之 实现一个SSO认证服务器是这样的!
上篇我们引入了SSO这个话题<15分钟了解SSO是个什么鬼!>.本篇我们一步步深入分析SSO实现机理,并亲自动手实现一个线上可用的SSO认证服务器!首先,我们来分析下单Web应用系统登录登 ...
- Python tkinter 实现简单登陆注册 基于B/S三层体系结构,实现用户身份验证
Python tkinter 实现简单登陆注册 最终效果 开始界面 注册 登陆 源码 login.py # encoding=utf-8 from tkinter import * from ...
- iview简单使用+按需加载组件的方法(全局和局部)
1,简单使用 vue项目中使用iview非常简单: 首先安装依赖: $ npm install iview --save 会安装最新版本的依赖,安装完成后package.json会出现如下图配置 表示 ...
随机推荐
- canvas绘制清晰的方法
很早就开始使用canvas,包括自己绘制各种图形,以及作为画布提供给诸如echarts,当canvas绘制细线条,特别是关于文字绘制会出现很模糊或者锯齿的感觉. <canvas ref=&quo ...
- 一些常用的IOS开发网站
开发教程: 即便过了入门阶段,还是要经常看看一些不错的实例教程.1.http://mobile.tutsplus.com/category/tutorials/iphone/ 比较新的一个网站,以前没 ...
- HDU 5778 abs (枚举)
abs 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5778 Description Given a number x, ask positive ...
- HDU 5792 World is Exploding (树状数组)
World is Exploding 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5792 Description Given a sequence ...
- 嵌入式LINUX入门到实践(一)
MINI2440 IIC协议 IIC协议在工程中应用广泛,在我看来,此协议的优势就在于其硬件及其简单,结构清晰. 首先来解读一下S3C2440A这款芯片的IIC协议. 一.一个协议的解读从如上结构图中 ...
- GMT 绘制台站分布图
set ps=test.psset J=M4i set R=73/135.5/10/54rem gmt gmtset FONT_ANNOT_PRIMARY 8p FONT_TITLE 8p gmt ...
- 《C语言编写 学生成绩管理系统》
/* (程序头部凝视開始) * 程序的版权和版本号声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名: 学生成绩管理 ...
- 终于用scons创建了一个MDK工程
这几天我在学着怎么使用RT-Thread.起初只想用一下里面的RTGUI,却一直没成功,功力实在不行啊. RT-Thread用了scons来创建工程,似乎还能编译,还有很多可配置项,很是方便.于是我想 ...
- 【M3】绝对不要以多态方式处理数组
1.考虑下面的情况,有个方法,如下: void Print(ostream& s, const Base array[], int size) { for(int i=0; i< siz ...
- Windows 7系统安装MySQL5.5.21图解
Win7系统安装MySQL5.5.21图解 大家都知道MySQL是一款中.小型关系型数据库管理系统,非常具有有用性,对于我们学习非常多技术都有帮助,前几天我分别装了SQL Server 2008和Or ...