给自己博客/网站加一个统一认证

  • A+
所属分类:安全闲碎
给自己博客/网站加一个统一认证
点击蓝字   关注我们


00
这里是废话

我们经常看到某些企业网站登录的时候,都是有个统一的账号登录所有的旗下网站。比如腾讯QQ、网易,还有学校的信息门户,都是一个账号畅游所有系统。腾讯QQ这种称之为CAS,信息门户称之为SSO。这俩是什么自己百度,我查了一下,同域的是SSO,不同域是CAS,至于到底是什么我也没细查。
那么今天,我要给自己的网站加上CAS(脱裤子放屁),个人网站完全没必要,但是为了方便(装逼),我把几个小项目单独开出来,然后加上认证,最后统一到一个门户。这就实现了多系统(给自己博客/网站加一个统一认证
01
起步

首先要明确流程,如下图:

给自己博客/网站加一个统一认证

那么首先是用户打开网站,请求访问,网站对用户请求进行重定向,直接发到认证服务器,认证服务器验证用户身份,通过后返回一个token,网站拿到token后会拿着token去认证服务器验证身份,验证通过后认证服务器返回用户信息,网站接收用户信息,然后放行。至此完成认证流程。
有了流程就简单了,剩下的就是利用代码对需求进行实现。
注意:以下都是作者自己撸的,可用性什么的都挺垃圾,就图一乐。
02
初步设计

根据流程图,首先写一个登录页面,用来处理用户请求,这里比较简单,直接要求用户跳转到认证服务器,使用get请求,携带认证域。

给自己博客/网站加一个统一认证

网站页面直接加一个丑陋的图片,加个a标签。

给自己博客/网站加一个统一认证

好的,前端页面搞定,用户在当前页面只需要登录就可以了。程序后台需要处理:
①当前登录域是否正确
②验证用户身份
那么我们来写后台(采用asp.net)

给自己博客/网站加一个统一认证

作者当天喝了假酒,写了一堆垃圾代码,凑活着看,这里首先在页面加载时对当前登录域,也就是redirect_url进行验证,验证是否是合法登录域。因为我看这里地方跳转到其他页面也算漏洞,故而处理之。
登录则是经典的SQL查询,过滤字符,参数化查询,设计采用根据用户名查数据库密文密码,然后对用户明文密码加密,然后做对比。登录方法写了个Login.ashx并不是文件后台处理(我也不知道为什么我这么写,迷惑,可能是为了以后前后端分离)

给自己博客/网站加一个统一认证

所以登录实际上是一个前端的处理过程。
登录处理不用写了,很简单的。
02
token处理

在用户认证通过后需要生成一个token用来给网站校验,同时这个token需要只能使用一次,而且只是短期使用。
初步计划是放在数据库里面(很伞兵),这样数据库压力很大,果断放弃,采用了Redis设计。将token信息存Redis(务必记住给Redis加密码,仅允许本地访问)。经过我的百度,成功掌握了基本语法。
首先安装引用

给自己博客/网站加一个统一认证

然后配置Redis链接
private static ServiceStack.Redis.RedisClient client = new ServiceStack.Redis.RedisClient("127.0.0.1", 6379, System.Web.Configuration.WebConfigurationManager.ConnectionStrings["redisPass"].ToString());
因为我把密码存在了web.config里面,所以这里很奇怪。
然后用
client.Set<string>(token, UUID,DateTime.Now.AddMinutes(2))
完成对token的存储,这个方法可以设置过期时间,这里设置的是2分钟(本来应该更短,我担心垃圾服务器处理不过来给自己博客/网站加一个统一认证
这里的uuid就是提前预设的用户信息,作为用户名,后面会传给网站的。
03
token验证

此时用户已经完成了登录,认证服务器重定向用户到网站,网站接收到token会主动请求认证服务器,进行token验证。

给自己博客/网站加一个统一认证

当然也是ashx。验证通过后认证服务器返回用户uuid,网站接收到uuid,跟本地用户信息进行验证,通过后设置session,未通过就提示用户信息不存在。
        public static Boolean Check(string token)        {            string APIUrl = "https://login.shikangsi.com/Token.ashx?token=" + token;            var request = WebRequest.Create(APIUrl);            request.Method = "GET";            var response = request.GetResponse();            using (var stream = new System.IO.StreamReader(response.GetResponseStream()))            {                string back = stream.ReadToEnd();
JavaScriptSerializer js = new JavaScriptSerializer(); Rootobject root = js.Deserialize<Rootobject>(back); if (root.Code == "0") { if (root.Msg == "xxxxxxxxxxxxxxxx") { return true; } else { return false; } } else { return false; }
} }
这里依然是魔幻写法,偷懒把uuid写死了。给自己博客/网站加一个统一认证
至此用户登录过程就算完成了,然后上线测试。
04
系统部署

部署比较简单,主要是测试。
打开https://edudata.shikangsi.com

给自己博客/网站加一个统一认证

成功显示(就是个页面当然没问题)
然后点击SKSID登录

给自己博客/网站加一个统一认证

跳转到认证页面,同时显示即将登录的域名称。

给自己博客/网站加一个统一认证

登录,token获取同时认证通过。

给自己博客/网站加一个统一认证

进入首页。
测试没毛病。
05
对接WordPress

思路也是一样的,加一个logincas.php文件处理登录就行了。
<?php//SKSID登录方法//史康思//20210726    //Imp to include    include('wp-load.php');    define('WP_USE_THEMES', false);    require('wp-blog-header.php');    // check is user is logged - if yes then print its role    if(is_user_logged_in() ) {        $user = wp_get_current_user();        $role = ( array ) $user->roles;        echo "role is ".$role[0];        wp_redirect('wp-admin/', 301);    }  else{    if($_GET['token']==null){      echo "not login";    }    else{            $url ="https://login.shikangsi.com/Token.ashx?token=".$_GET['token'];      $ch = curl_init();      //设置选项,包括URL      curl_setopt($ch, CURLOPT_URL, $url);      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);      curl_setopt($ch, CURLOPT_HEADER, 0);      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//绕过ssl验证      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);      //执行并获取HTML文档内容      $output = curl_exec($ch);      //释放curl句柄      curl_close($ch);
$data = json_decode($output,true); //echo $data['Msg']; if($data['Msg']=="xxxxxxxxxxxxx"){ //if(1==1){ $creds = array(); $creds['user_login'] = 'xxxxxxxxxxxxx'; // 用户名自行修改 $creds['user_password'] = 'xxxxxxxxxxxxx'; // 密码 $creds['remember'] = true; $user = wp_signon( $creds, false ); if ( is_wp_error($user) ){ echo $user->get_error_message(); } else{ $user = get_user_by('login', 'xxxxx' ); // If no error received, set the WP Cookie if ( !is_wp_error( $user ) ) { wp_clear_auth_cookie(); wp_set_current_user ( $user->ID ); // Set the current user detail wp_set_auth_cookie ( $user->ID ); // Set auth details in cookie $message = "Logged in successfully"; wp_redirect('wp-admin/', 301); } else { $message = "Failed to log in"; } } } else{ echo "登录用户有误"; } } }
?>
我用我学了俩小时的蹩脚PHP写了个文件处理登录,原理一样拿token去换uuid,这里uuid也是偷懒写死了。主要是wp的登录处理,我找了个文章,里面提到WordPress有内置登录函数。一个是免密码一个是正常的,这里采用了后者。

给自己博客/网站加一个统一认证

采用了内置的wp_signon函数实现登录。
下面进行测试。

06
WordPress测试

其实这个没什么难度,直接删除wp-login.php文件(备份一下),然后重写一个。

给自己博客/网站加一个统一认证

显示一个超链接,一样的跳转登录。

给自己博客/网站加一个统一认证

可以看到登录域已经改变

给自己博客/网站加一个统一认证

成功登录
07
总结

个人其实用不到,主要是企业使用,多系统多账号过于复杂,采用一个认证系统大大提高工作效率,减少登录次数,优化用户体验,我这完全是无聊(还有是为了装逼)。然后搞了个CAS,当然我没写,支持外部应用的对接。给自己博客/网站加一个统一认证
做戏做全套,我还发布了《SKSID接入文档》给自己博客/网站加一个统一认证

给自己博客/网站加一个统一认证

给自己博客/网站加一个统一认证

为以后开发做好了铺垫,直接省略认证过程,全部接入统一认证。方便,但不完全方便。
08
关于

欢迎关注

排名不分先后,分了你也不能把我怎么样

文章推荐

利用msf框架对安卓手机进行简单操作

信息收集---CDN绕过

兵器谱等待查收中——寻鸣

通用漏洞评分系统CVSS2.0(提供附件)

给自己博客/网站加一个统一认证
END
给自己博客/网站加一个统一认证
扫码关注我们
每天摸鱼,舒服
随缘更新,自在
给自己博客/网站加一个统一认证


本文始发于微信公众号(墨雪飘影):给自己博客/网站加一个统一认证

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: