问题描述
上一篇文章写了【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
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
本博客Android APP 下载 |
![]() |
支持我们就给我们点打赏 |
![]() |
支付宝打赏 支付宝扫一扫二维码 |
![]() |
微信打赏 微信扫一扫二维码 |
![]() |
如果想下次快速找到我,记得点下面的关注哦!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2016-12-23 layer弹出信息框API