ASP.NET整合Discuz PHP站 并实现用户同步
先决条件是要搭好服务端环境,详见我的另一篇文章:Discuz X3 IIS7.5從零開始搭建 一、首先是了解Discuz的用户解决方案,开发组很聪明,使用一个叫Ucenter(即用户中心)的东西来进行用户的综合管理,并开放了一系列的API,让我们可以很方(xiang)便(si)的进行多站同步登陆、注册、退出等等操作。不幸的是,它主要面向的是PHP用户,其他语言几乎没有任何的方便性可言——你必须自己实现用户的管理方法、加密方法、API调用方法等等,如果每个人都自己去写一遍这玩些意儿,简直堪称巨大工程。 好在百度一番之后,发现确实已经有大神实现了.NET API For Ucenter,不过想要了解得比较详细,还是要系统的学习:
http://www.dozer.cc/2011/01/ucenter-api-in-depth-1st/ 感谢这位大神的无私奉献,他在自己的网站中详细的讲解了UcenterAPI的登陆、加密等原理,并公布了一系列的代码及基本解决方案,最重要的是他还公开了.NET API For Ucenter源代码并提供下载,支持手动修改再编译。
简要说明一下Ucenter的同步流程:用户在任何一个站点登陆 —> 后台获取Ucenter加密后用户信息 —> 通过javascript调用每个子站点的接口(uc.php或者uc.ashx之类的) —> 接口各自实现站点的登陆(即同步) 。 因此一定要有一个页面来输出这段javascript,囧…
结合两个实例,我的做法如下:
2.1、使用VS2010建立一個测试Web項目,原封不動加入編譯好的DLL及自定義的Ucenter接口:uc.ashx,结构如图
我們只使用Default.aspx頁面測試就行了,拖入兩個按鈕:登入和登出,在cs文件中的完整代碼如下:
在通信接口uc.ashx文件中,需要让它继承已封装类:UcApiBase ,不用继承自IHttpHandler(UcApiBase中已继承)。
uc.ashx一定要在根目錄下的”api”文件夾中,這是Ucenter那边规定的,不可更改。在这个接口中,我们需要逐一实现API同步的方法,包括登陆、登出、修改密码、更改密码等等方法。完整代码如下:
好,接下来是VS项目中最后一步,在web.config的<appSettings>节点加入以下内容,注意看我的藍色注释
以上除了必填部分其他可保持默認。记得将应用ID填对。至此.NET程序部分結束。
2.2、论坛设定。
登陸Discuz论坛后台,进入 Ucenter —> 应用管理 —> 添加新应用,图我就照搬dozer的了,很清晰:
如果順利的話返回应用列表你就能看到一个论坛应用(Discuz),一個.NET应用(你刚加的,记得将ID填到web.config里面),如果全部通信成功,就已经大功告成~!
接下来运行.NET网站Default页,点击登入/登出按钮,同时打开Discuz论坛,刷新试试是否已经能够同步登入登出!!
三、当但完成以上步骤之后,我们成功的将主站登录用户同步到了 Discuz论坛上!但是痛苦才刚刚开始!!!
我悲剧的发现,主站登录能够同步到论坛,但论坛登录却无法同步到主站!说好的双向同步呢??网上也有人遇到同样问题,但几乎没有人在解决问题后进行分享,能找到的几个解决方案我都挨个儿尝试了一遍,对于我这种PHP白痴来说真的是看天书啊 甚至什么防火墙问题啦、文件权限啦都去查看了,仍旧一无所获
最后在我即将放弃的时候,突然找到了这位“解决世界性难题”的哥们儿发的贴子:解决了一个世界性难题,关于DZ整合互通 顿时整个人犹如醍醐灌顶,瞬间茅塞顿开,找到 /data/cache/apps.php ,编辑之!
果不其然,这个文件中数组$_CACHE[‘apps’]中本应有2个应用,不知道什么时候被我搞没了…可能是我之前在论坛后台操作有误(?)导致的吧。好吧我也没见过这个数组的结构,不知道怎么才可以手动填上,先实现效果再说。于是打开/uc_client/client.php,定位到uc_user_synlogin和uc_user_synlogout方法,注释掉所有的if语句,再次调试!!!
果断发现论坛登录和登出信息已经同步到了所有站点!百感交集啊!
问题的原因呢,其实在上文上我已经提到过~~Ucenter是通过javasript去访问每个应用的接口来实现多站同步;而在修改之前,我发现登陆后页面并没有输出这段javasript 代码块。原来uc_user_synlogin和uc_user_synlogout方法中,它们都要先判断数组$_CACHE[‘apps’] 长度大于零,才会输出javasript 代码块 ,因此去掉判断之后,就老老实实的工作啦~
能实现同步登陆,其他问题已经不大了, 等待接下来的挑战!
评论