此文已过时,最新版在:
目录:
- 开篇
- 通讯原理:UCenter API 与子站之间的通讯原理和单点登陆原理
- 加密与解密:AuthCode详解 & AuthCode函数翻译过程中的注意点
- 网站搭建: 康盛旗下网站 & Asp.net 网站搭建
前言
学生在线下面有多个子站,其 中包括一个Discuz论坛
那当然要充分利用强大的UCenter来实现多点登陆
UCenter和别的网站跨域通讯,那用的肯定是WebService
PHP官方封装好了,所以很容易就搞定了,但是.Net…
网上找不到任何核心的通讯手册,除非去扣那个PHP的开发手册
Google后:
UCenter 接口开发手册:这个就是官方封装过的版本,其实这个根本不能叫接口开发手册,里面介绍的都是已经封装过的PHP函数,对核心只字不提
一个项目文件: 刚看到这个我很兴奋,但是按照它说的调整好后,却不能用!一开始还不懂为什么,懂得原理后才知道,它其实是个空壳
一 个DLL文件:这个DLL很强大,可惜,没有例程、没有手册、没有注释,还有BUG…
但是相对来说,最后的那个DLL是最接近的,所以决定反编译之,开始研究
最后就有了Dozer编辑版~ 成功实现通讯!
来源:dozer.cnblogs.com 作者:Dozer
UCenter通讯原理
原理网上很多,我也只是知道一个皮毛,在这里就以同步登陆为例子,来讲解一下这个类库的用法
以上就是同步登陆的步骤,如果你已经配置好,那么只需要这3行代码
01 | namespace WebApplication1 |
02 | { |
03 | public partial class Default : System.Web.UI.Page |
04 | { |
05 | protected void Page_Load( object sender, EventArgs e) |
06 | { |
07 | var uc = new UCClient(); |
08 | var user = uc.UC_User_Login( "user" , "password" ).User; |
09 | Response.Write(uc.UC_User_Synlogin(user.Uid)); |
10 | } |
11 | } |
12 | } |
总之,在你的网站程序中需要有2个部分
一个是UCAPI部分,需要给UCenter调用
另外一部分就是UClient部分,用于调用UCenter
这样才能在最后实现双向通讯
来源:dozer.cnblogs.com 作者:Dozer
UCenter端配置过程
按照惯例,登陆UCenter后台,然后添加应用程序
别的地方和PHP网站一样,只有一个地方,就是“应用接口文件名称”的地方
需要填写uc.ashx
这个和此类库的原理有关,后面详解
提交…可惜,显示通讯不成功,因为我的网站还没配置呢~
提交后再次编辑,会得到一段PHP的配置信息
01 | define( 'UC_CONNECT' , 'mysql' ); |
02 | define( 'UC_DBHOST' , localhost'); |
03 | define( 'UC_DBUSER' , 'root' ); |
04 | define( 'UC_DBPW' , 'mysql' ); |
05 | define( 'UC_DBNAME' , 'uc_discuz' ); |
06 | define( 'UC_DBCHARSET' , 'utf8' ); |
07 | define( 'UC_DBTABLEPRE' , '`uc_discuz`.uc_' ); |
08 | define( 'UC_DBCONNECT' , '0' ); |
09 | define( 'UC_KEY' , 'qwertyui' ); |
10 | define( 'UC_API' , 'http://localhost/ucenter' ); |
11 | define( 'UC_CHARSET' , 'utf-8' ); |
12 | define( 'UC_IP' , '127.0.0.1' ); |
13 | define( 'UC_APPID' , '19' ); |
14 | define( 'UC_PPP' , '20' ); |
先留着,后面会用到~
来源:dozer.cnblogs.com 作者:Dozer
WebApplication端配置过程
第一步当然是Web.config文件
新建一个网站应用程序,并且引用这个类库
上面的配置信息是PHP用的,我们把它转换到Web.config文件中去
01 | < appSettings > |
02 | < add key = "UC_CONNECT" value = "mysql" /> |
03 | < add key = "UC_DBHOST" value = "localhost" /> |
04 | < add key = "UC_DBUSER" value = "root" /> |
05 | < add key = "UC_DBPW" value = "mysql" /> |
06 | < add key = "UC_DBNAME" value = "uc_discuz" /> |
07 | < add key = "UC_DBCHARSET" value = "utf8" /> |
08 | < add key = "UC_APPIDUC_DBTABLEPRE" value = "`uc_discuz`.uc_" /> |
09 | < add key = "UC_DBCONNECT" value = "0" /> |
10 | < add key = "UC_KEY" value = "qwertyui" /> |
11 | < add key = "UC_API" value = "http://localhost/ucenter" /> |
12 | < add key = "UC_CHARSET" value = "utf-8" /> |
13 | < add key = "UC_IP" value = "127.0.0.1" /> |
14 | < add key = "UC_APPID" value = "19" /> |
15 | < add key = "UC_PPP" value = "20" /> |
16 | </ appSettings > |
来源:dozer.cnblogs.com 作者:Dozer
第二步是建立UCAPI,供UCenter调用(这步完成后UCenter中会显示通讯正常)
1、新建一个叫API的文件
2、在里面建立一个新文件uc.ashx(不要建立.aspx)
3、打开这个uc.ashx文件,本来它继承于IHttpHandler,我们把它修改一下,让它继承于 FS.API.UCenter.UCAPI.UCAPIBase
4、实现一下这个抽象类的函数(利用VS的代码自动完成功能)
5、接下来你就可以在这里写一些逻辑代码了
比如,当有人在别的站同步登陆后,会通知你的站点
然后会调用 Synlogin 函数,这时候,你就需要在这个函数里写一些代码
例如:写cookie之类的
Q:UCenter为什么不直接写Cookie,子站读Cookie?
A:UCenter实现的是跨域登陆,所以每个子站的Cookie是分开的,需要自己实现!
好了,完成这步后打开UCenter,你会发现:通讯成功!
UCenter测试通讯成功仅仅是调用了一个test函数,只要上述配置没写错,那就会显示通讯成功!但是它还不能实现任何功能,需要把上面的那些 函数完善~
来源:dozer.cnblogs.com 作者:Dozer
第三步是在网站中调用UCenter的接口了
这个超级简单,其实“UCenter通讯原理”那部分代码
为什么要Respon.Write这段东西?
这和UCenter同步登陆原理有关,向UCenter传递信息,告诉它要同步登陆后,它不会自己通知别的子站,而是返回一段JS,需要你的网站调 用这段JS,然后通知各个子站
OK了~所有配置完成~
来源:dozer.cnblogs.com 作者:Dozer
我对原来的那个DLL做了什么?
1、原来的DLL编码部分有几个严重的问题,导致编码错误,无法提交表单
2、原来的DLL估计是很久以前写的,里面序列化和反序列化的时候,规则和现在UCenter的规则不同,我根据现在的规则,修改了一下
3、修复别的一些小BUG
来源:dozer.cnblogs.com 作者:Dozer
类库下载&示例代码
代码的原始作者找不到了,遵循开源精神
另外不保证目前代码全部正确,我只是测试了几个函数
类库源代码:下载
示例代码:下载