【ASP.NET】UCenter实现多站点同步注册
问题描述
上一篇文章写了【ASP.Net】UCenter实现多站点同步登录退出
在整合论坛的时候,同步注册也是相当必要的一个功能:将论坛注册的用户同步到自己的网站,自己网站注册的用户同步到论坛。
官方提供的API里并没有这个功能,我们只能自己实现。
问题分析
根据UCenter同步登录的原理:
- 在某个网站登录成功后,向UCenter发出一个同步登录通知
- UCenter接收到通知后获取所有app列表,生成一段请求所有开启同步登录app的uc接口传递
action=synlogin&time=xxx&uid=xxx等信息的<script></script>字符串- 该网站拿到这一段js后输出到页面,页面就会请求这些app的uc接口
- app接收到同步登录的通知,在网站写登录的cookie/session实现同步登录
接下来,就看看同步登录的具体逻辑
同步登录分析
在Discuz! X3.2的class.member.php文件约139行和276行,有这么一段代码


意思是判断是否开启了同步登录,是则调用uc_user_synlogin获取同步登录的js并输出到页面
那我们再来看一下uc_user_synlogin函数,在/uc_client/client.php文件第365行

调用了一个uc_api_post函数,找一下这个函数,就在当前文件中

原来是请求了/uc_server/index.php,并传递m=user&a=synlogin
那我们就再看一下/uc_server/index.php 文件

把刚刚的传递的m拼上control,a前面拼上on,即创建了一个usercontrol对象,调用了onsynlogin方法
而这个usercontrol类就在/uc_server/control/user.php文件中,看31行

终于找到了这个同步登录的真面目!里面干的事情就是上面所说的,获取全部开启了同步登录的app,然后发出同步登录通知(请求uc接口,传递action=synlogin&username=xxx等参数,通知各个app处理登录)
处理同步注册
先从底层开始,依葫芦画瓢。还是在/uc_server/control/user.php文件中,onsynlogin方法的下面
复制一下上面的onsynlogin方法,把注册必填的username password email参数替换进去,改造成我们需要的onsynregister函数。

接下来,倒回到/uc_client/client.php文件第365行,uc_user_synlogin方法这里,同样复制一下,改造成一个uc_user_synregister方法

最后一步,在/source/class/class_member.php,第923行,论坛注册的地方,加上我们同步注册的代码

到这里,论坛每次有新用户注册之后,UCenter就会向所有应用的站点发出同步请求,这时只需要在应用站点的/API/uc.ashx文件中增加一个注册本站用户的接口功能即可实现站点与论坛同步注册的功能。
改造DS.Web.UCenter
- 在
UcActions.cs文件里面添加一个SynRegister属性
/// <summary>
/// 同步注册
/// </summary>
public static string SynRegister { get { return "synregister"; } }

- 在
UcApiBase.cs文件添加同步注册的处理,就加在登录的后面
首先是抽象方法声明
/// <summary>
/// 同步登陆
/// </summary>
/// <param name="uid">uid</param>
/// <returns></returns>
public abstract ApiReturn SynLogin(int uid);
/// <summary>
/// 同步注册
/// </summary>
/// <param name="username">用户名</param>
/// <param name="password">密码</param>
/// <param name="email">邮箱</param>
/// <returns></returns>
public abstract ApiReturn SynRegister(string username, string password, string email);
还有action处理
else if (Args.Action == UcActions.SynLogin)
{
synLogin();
}
// 同步注册
else if (Args.Action == UcActions.SynRegister)
{
synRegister();
}
调用同步注册的地方
private void synLogin()
{
if (!UcConfig.ApiSynLogin) writeForbidden();
Response.Headers.Add("P3P", "CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\"");
int uid;
int.TryParse(Args.QueryString["uid"], out uid);
writeEnd(SynLogin(uid));
}
// 同步注册
private void synRegister()
{
string username = Args.QueryString["username"];
string password = Args.QueryString["password"];
string email = Args.QueryString["email"];
writeEnd(SynRegister(username, password, email));
}
- 最后在
/API/uc.ashx接口中加上自己网站同步注册的逻辑(将用户数据插入数据库等等)
public override ApiReturn SynRegister(string username, string password, string email)
{
return ApiReturn.Success;
}
OK!大功告成
作者:lancely
链接:https://www.jianshu.com/p/1caa425ef24b
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【ASP.NET】UCenter实现多站点同步注册的更多相关文章
- 【ASP.NET】UCenter实现多站点同步登录退出
利用UCenter实现discuz论坛和应用网站同步登录和退出功能 测试环境:Discuz! X3.2.UCenter 1.6..Net Framework 4.0 进入Discuz 后台的UCent ...
- ASP.NET Core的路由[1]:注册URL模式与HttpHandler的映射关系
ASP.NET Core的路由是通过一个类型为RouterMiddleware的中间件来实现的.如果我们将最终处理HTTP请求的组件称为HttpHandler,那么RouterMiddleware中间 ...
- Ucenter整合Thinkphp 双向同步登录退出
1.整合初步工作: 1,安装Ucenter,完成后添加应用,填写要对接的网站地址 2,api , uc_client目录放置对接项目的根目录 3,通信对接,新建Ucenter组,confi文件填写在u ...
- 安装VS2017后打开项目提示 asp.net 4.0尚未web服务器注册
Visual Studio 2017 出来了,手痒安装完成后打开原来的项目缺提示,asp.net 4.0尚未web服务器注册.郁闷了… 按照提示的方法,如何:将 ASP.NET Web 应用程序升级到 ...
- 基于ASP.NET core的MVC站点开发笔记 0x01
基于ASP.NET core的MVC站点开发笔记 0x01 我的环境 OS type:mac Software:vscode Dotnet core version:2.0/3.1 dotnet sd ...
- 使用ASP在IIS创建WEB站点的函数
程序代码: '=========================================================='函数介绍:创建WebSite'本函数使用ADSI,需要Adminis ...
- ASP.net(C#)利用SQL Server实现注册和登陆功能
说说我现在吧,楼主现在从事的事IT行业,主攻DotNet技术:当然这次上博客园我也是有备而来,所有再次奉献鄙人拙作,以飨诸位,望诸位不吝赐教. 世界上大多数的工作都是熟练性的工种,编程也不例外,做久了 ...
- ASP.NET4.5Web API及非同步程序开发系列3
ASP.NET4.5Web API及非同步程序开发系列(3) 接着上一篇博客的内容做一个补充,正好是一个大哥提出来的,我们看看一个有趣的现象. 请求相关问题的补充: 我们先在Controller中的定 ...
- ASP.NET4.5Web API及非同步程序开发系列
ASP.NET4.5Web API及非同步程序开发系列 认识ASP.NET WEB API 他的前身为WCF WEB API用于协助WCF支持RestFul.现在集成进ASP.NET,正式更名为ASP ...
随机推荐
- Spring MVC全局异常处理
继承HandlerExceptionResolver接口实现自己的处理方法,如: public class MyHandlerExceptionResolver implements HandlerE ...
- mysql select in 怎么优化
2017年7月10日 22:36:54 星期一 原理: 把select where in 变换成 "where = " 或者 "where between and &qu ...
- mysql 定时备份bat脚本 ,方便小型服务简单快速备份mysql
mysql定时备份bat脚本 echo 数据库为用户名为root 密码为root 数据库名为kdykt echo mysqldump 命令如果没有配置环境变量要在bin目录下执行 set " ...
- CF 489C 暴力处理
题意: 给你 数的长度 m, 数的每个数的和 Sum: 输出 这个数最小值 和最大值 #include<bits/stdc++.h> using namespace std; int ma ...
- IOS 颜色的宏定义
#define RGB(r, g, b, a) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a] self.vie ...
- Eclipse中设置Java代码格式化
一.自定义 Java 代码格式化 [Java-Code-Formatting.xml 下载],下载完毕以后,打开 Eclipse 找到如下图界面,点击 Import 导入即可.
- Oracle 数据备份与恢复
前言 一:备份与恢复概述 二:RMAN 工具概述 1: RMAN 组件 1: RMAN命令执行器 [oracle@localhost ~]$ rman target system/nocatalog ...
- Pandas模块:表计算与数据分析
目录 Pandas之Series Pandas之DataFrame 一.pandas简单介绍 1.pandas是一个强大的Python数据分析的工具包.2.pandas是基于NumPy构建的. 3.p ...
- kafka消息的分发与消费
关于 Topic 和 Partition: Topic: 在 kafka 中,topic 是一个存储消息的逻辑概念,可以认为是一个消息集合.每条消息发送到 kafka 集群的消息都有一个类别.物理上来 ...
- STL的注意事项
template是一个泛化的:使用template时开始仅仅是声明,具体的例如:k<int> a;叫做实例化显式实例化:类似k<int>a:明确指出哪种类型:隐式实例化:类似k ...