Asp.net整合Disucuz X 通过Ucenter同步登陆

开篇首先感谢下Dozer同学,他的几篇博文帮助CoderMan省下了很多工作,通过反编译官方的DLLDozer同学二次开发的SDK,我也是丝毫不客气的就拿来直接用了。

那我们就来一步步说一下Asp.net通过Ucenter与Discuz X系列的整合了。

首先搭建自己的网站,在网站目录下建立API文件夹(必须是API文件夹),开始我很疑惑,后来通过查看Discuz的源代码发现了原因,打开uc_server\model\note.php文件找到get_url_code方法,这个方法是每次接口获取远程地址的方法,仔细观察下代码就知道为什么接收页地址父文件夹一定要叫API了:

01 function get_url_code($operation$getdata$appid)
{
02         $app $this->apps[$appid];
03         $authkey $app[‘authkey‘];
04         $url $app[‘url‘];
05         $apifilename =
isset(
$app[‘apifilename‘])
&& 
$app[‘apifilename‘]
$app[‘apifilename‘]
‘uc.php‘;
06         $action $this->operations[$operation][1];
07         $code =
urlencode(
$this->base->authcode("$action&".($getdata "$getdata&" ‘‘)."time=".$this->base->time, ‘ENCODE‘$authkey));
08          
09         return $url."/api/$apifilename?code=$code";
10     }

因为Discuz的源代码里面竟然在接收页地址路径前加了API,Coderman认为这样不好,害得很多人调试半天通不了。说了废话一堆,看不下去的朋友肯定自己调试的时候要吃亏了。下面开始步入正题:一、引入SDK,建立接收页

SDK下载地址:https://github.com/dozer47528/UCenter-API-For-DotNet

接下来建立uc.ashx文件如下:

继承SDK中的接口UcApiBase,有如下方法重载:

01 public override ApiReturn
DeleteUser(IEnumerable<
int>
ids)
02        {
03            throw new NotImplementedException();
04        }
05  
06        public override ApiReturn
RenameUser(
int uid, string oldUserName, string newUserName)
07        {
08            throw new NotImplementedException();
09        }
10  
11        public override UcTagReturns
GetTag(
string tagName)
12        {
13            throw new NotImplementedException();
14        }
15  
16        public override ApiReturn
SynLogin(
int uid)
17        {
18            throw new NotImplementedException();
19        }
20  
21        public override ApiReturn
SynLogout()
22        {
23            throw new NotImplementedException();
24        }
25  
26        public override ApiReturn
UpdatePw(
string userName, string passWord)
27        {
28            throw new NotImplementedException();
29        }
30  
31        public override ApiReturn
UpdateBadWords(UcBadWords badWords)
32        {
33            throw new NotImplementedException();
34        }
35  
36        public override ApiReturn
UpdateHosts(UcHosts hosts)
37        {
38            throw new NotImplementedException();
39        }
40  
41        public override ApiReturn
UpdateApps(UcApps apps)
42        {
43            throw new NotImplementedException();
44        }
45  
46        public override ApiReturn
UpdateClient(UcClientSetting client)
47        {
48            throw new NotImplementedException();
49        }
50  
51        public override ApiReturn
UpdateCredit(
int uid, int credit, int amount)
52        {
53            throw new NotImplementedException();
54        }
55  
56        public override UcCreditSettingReturns
GetCreditSettings()
57        {
58            throw new NotImplementedException();
59        }
60  
61        public override ApiReturn
GetCredit(
int uid, int credit)
62        {
63            throw new NotImplementedException();
64        }
65  
66        public override ApiReturn
UpdateCreditSettings(UcCreditSettings creditSettings)
67        {
68            throw new NotImplementedException();
69        }

其中SynLogin,SynLogout俩个函数就是实现同步登出登录的。

注:如果需要实现写入Session等操作,那不妨像我一样修改下SDK代码,接下来的修改很重要

修改SDK中的UcApiBase文件中的如下方法:

001 public void ProcessRequest(HttpContext
context)
002        {
003            Response
= context.Response;
004            Request
= context.Request;
005            Args
new UcRequestArguments(Request);
006            if (!check()) return;
007            switchAction(context);
008        }
009  
010        #region
私有
011        private HttpResponse
Response { 
getset;
}
012        private HttpRequest
Request { 
getset;
}
013        private IUcRequestArguments
Args { 
getset;
}
014        ///
<summary>
015        ///
检查合法性
016        ///
</summary>
017        ///
<returns></returns>
018        private bool check()
019        {
020            if (Args.IsInvalidRequest)
021            {
022                writeEnd("Invalid
Request"
);
023            }
024            if (Args.IsAuthracationExpiried)
025            {
026                writeEnd("Authracation
has expiried"
);
027            }
028            return true;
029        }
030        private void writeEnd(string msg)
031        {
032            Response.Write(msg);
033            Response.End();
034        }
035        private void writeEnd<T>(UcCollectionReturnBase<T>
msg)
036            where
T : UcItemReturnBase
037        {
038            writeEnd(msg.ToString());
039        }
040        private void writeEnd(ApiReturn
result)
041        {
042            var
msg = result == ApiReturn.Success ? UcConfig.ApiReturnSucceed : UcConfig.ApiReturnFailed;
043            Response.Write(msg);
044            Response.End();
045        }
046        private void writeForbidden()
047        {
048            writeEnd(UcConfig.ApiReturnForbidden);
049        }
050        private void switchAction(HttpContext
context)
051        {
052            if (Args.Action
== UcActions.Test)
053            {
054                test();
055            }
056            else if (Args.Action
== UcActions.DeleteUser)
057            {
058                deleteUser();
059            }
060            else if (Args.Action
== UcActions.RenameUser)
061            {
062                renameUser();
063            }
064            else if (Args.Action
== UcActions.GetTag)
065            {
066                getTag();
067            }
068            else if (Args.Action
== UcActions.SynLogin)
069            {
070                synLogin(context);
071            }
072            else if (Args.Action
== UcActions.SynLogout)
073            {
074                synLogout(context);
075            }
076            else if (Args.Action
== UcActions.UpdatePw)
077            {
078                updatePw();
079            }
080            else if (Args.Action
== UcActions.UpdateBadWords)
081            {
082                updateBadWords();
083            }
084            else if (Args.Action
== UcActions.UpdateHosts)
085            {
086                updateHosts();
087            }
088            else if (Args.Action
== UcActions.UpdateApps)
089            {
090                updateApps();
091            }
092            else if (Args.Action
== UcActions.UpdateClient)
093            {
094                updateClient();
095            }
096            else if (Args.Action
== UcActions.UpdateCredit)
097            {
098                updateCredit();
099            }
100            else if (Args.Action
== UcActions.GetCreditSettings)
101            {
102                getCreditSettings();
103            }
104            else if (Args.Action
== UcActions.GetCredit)
105            {
106                getCredit();
107            }
108            else if (Args.Action
== UcActions.UpdateCreditSettings)
109            {
110                updateCreditSettings();
111            }
112        }

将请求上下文传入到方法中,这样我们就可以在uc.ashx写Session了,将SynLogin,SynLogout修改成:

01 public override ApiReturn
SynLogin(
int uid,
HttpContext context)
02        {
03            try
04            {
05                IUcClient
client = 
new UcClient();
06                UcUserInfo
user = client.UserInfo(uid);
07                if (user.Success)
08                {
09                    LoggerCore.Debug(user.Uid
"--" +
user.UserName);
10                    context.Session["uid"]
= user.Uid;
11                    context.Session["username"]
= user.UserName;
12                    context.Session["email"]
= user.Mail;
13                    return ApiReturn.Success;
14                }
15                return ApiReturn.Failed;
16            }
17            catch (Exception
ex)
18            {
19                LoggerCore.Debug("远程登录错误",
ex);
20                return ApiReturn.Failed;
21            }
22        }
23  
24        public override ApiReturn
SynLogout(HttpContext context)
25        {
26            try
27            {
28                context.Session.Abandon();
29            }
30            catch (Exception)
31            {
32                 
33                throw;
34            }
35             
36            return ApiReturn.Success;
37        }

C#部分的代码修改到这里就结束了。

二、配置Ucenter

如下图: 通信密钥的地方大家随便填,生成一段Guid也是可以的。
运行你的Asp.net项目,是不是通信成功了?

Coderman走到这一步蛋蛋差点碎了,因为调试半天都特么的不成功,百思不得其解,查看数据库,调试Discuz的源码,最后发现原来通信配置是通过生成的配置文件缓存读取的,好吧,速度赶紧把Cache删除掉吧,注意有俩处,一处是uc_server文件下的uc_server\data\cache\apps.php,这负责的是Ucenter与第三方应用之间的通信;另外一处是uc_client\data\cache\apps.php,这负责Discuz登录或者其它用户操作通知第三方应用。 至此,通信应该成功了,运行Asp.net代码,在SynLogin方法处打上断点,去Discuz网站前台登录吧,本地LocalHost应该是通信成功了。

三、修改Asp.net的Web.config文件

用于Asp.net程序通知Discuz同步登陆登出,配置如下:

01 <appSettings>
02   <!--客户端版本-->
03   <add key="UC_CLIENT_VERSION" value="1.5.2"/>
04   <!--发行时间-->
05   <add key="UC_CLIENT_RELEASE" value="20101001"/>
06  
07   <!--API
开关(value类型:True False 默认值:True)-->
08   <!--是否允许删除用户-->
09   <add key="API_DELETEUSER" value="True"/>
10   <!--是否允许重命名用户-->
11   <add key="API_RENAMEUSER" value="True"/>
12   <!--是否允许得到标签-->
13   <add key="API_GETTAG" value="True"/>
14   <!--是否允许同步登录-->
15   <add key="API_SYNLOGIN" value="True"/>
16   <!--是否允许同步登出-->
17   <add key="API_SYNLOGOUT" value="True"/>
18   <!--是否允许更改密码-->
19   <add key="API_UPDATEPW" value="True"/>
20   <!--是否允许更新关键字-->
21   <add key="API_UPDATEBADWORDS" value="True"/>
22   <!--是否允许更新域名解析缓存-->
23   <add key="API_UPDATEHOSTS" value="True"/>
24   <!--是否允许更新应用列表-->
25   <add key="API_UPDATEAPPS" value="True"/>
26   <!--是否允许更新客户端缓存-->
27   <add key="API_UPDATECLIENT" value="True"/>
28   <!--是否允许更新用户积分-->
29   <add key="API_UPDATECREDIT" value="True"/>
30   <!--是否允许向UCenter提供积分设置-->
31   <add key="API_GETCREDITSETTINGS" value="True"/>
32   <!--是否允许获取用户的某项积分-->
33   <add key="API_GETCREDIT" value="True"/>
34   <!--是否允许更新应用积分设置-->
35   <add key="API_UPDATECREDITSETTINGS" value="True"/>
36   <!--API
开关结束-->
37  
38   <!--返回值设置-->
39   <!--返回成功(默认:1)-->
40   <add key="API_RETURN_SUCCEED" value="1"/>
41   <!--返回失败(默认:-1)-->
42   <add key="API_RETURN_FAILED" value="-1"/>
43   <!--返回禁用(默认:-2)-->
44   <add key="API_RETURN_FORBIDDEN" value="-2"/>
45   <!--返回值设置结束-->
46  
47   <!--[必填]通信密钥-->
48   <add key="UC_KEY" value="xxxxxxxxx"/>
49   <!--[必填]UCenter地址-->
50   <add key="UC_API" value="http://www.xxxxxx.com/uc_server"/>
51   <!--[必填]默认编码-->
52   <add key="UC_CHARSET" value="utf-8"/>
53   <!--[非必填]UCenter
IP-->
54   <add key="UC_IP" value=""/>
55   <!--[必填]应用ID-->
56   <add key="UC_APPID" value="2"/>
57 </appSettings>

四、发布网站后修改Cookie域

本地好好的同步登录登出放到服务器上确不太灵光了,想了想是不是Cookie域的原因。首先修改Discuz的Cookie域,找到配置文件,修改配置文件:

1 $_config[‘cookie‘][‘cookiepre‘]
‘hUDo_‘;
2 $_config[‘cookie‘][‘cookiedomain‘]
‘.cartrip.cc‘;
3 $_config[‘cookie‘][‘cookiepath‘]
‘/‘;

再来到Asp.net的Web.config添加或者修改cookie域:

1 <httpCookies domain=".cartrip.cc"/>

结束语:再次感谢Dozer的无私奉献,帮大家节省了很多时间和精力,Coderman的俩个网站也已经这样一步步实现了同步登陆和登出,分别是http://www.cartrip.cchttp://piao.cartrip.cc。有朋友认真看完了的话还没有成功的话,那可能是Coderman写的还是不够清楚,那就联系我批斗我吧。

注:文章由CoderMan原创,转载请说明出处:CoderMan官方主页

时间: 2024-08-05 09:44:13

Asp.net整合Disucuz X 通过Ucenter同步登陆的相关文章

netMVC 搭建Ucenter 同步登陆退出discuz

先看一下效果 首先准备材料: 1.ucenter for net :https://github.com/dozer47528/UCenter-API-For-DotNet or http://pan.baidu.com/s/1i3znQV7 2.uc.ashx  下面是具体代码 using DS.Web.UCenter; using DS.Web.UCenter.Api; using DS.Web.UCenter.Client; using log4net; using pc_manishi.

ucenter同步登陆机制

有个ucenter可以用来实现多个站点同时登陆同时退出,用户同步的功能. 首先站点都要引入一个uc_client这样一个客户端,以登陆为例,登陆时首先会调用一个外部函数,uc_client/client.php下的uc_user_login检查是否存在此用户,如果正确则继续执行登陆代码,检测此用户过程:通过用户是以什么方式连的uc(mysql还是http post)然后去相应地用不同函数来检测用户,检测完成后实现本地登陆,代码自己写,然后让其他应用程序也登陆,此时调用外部函数uc_user_sy

UCenter 通信失败 和 无法同步登陆的调试方法

1. 看请求 2./uc_server/control/admin/app.php echo "\$url = $url <br />\n \$status = $status<br />\n";die('haha'); 打印下url即可知道哪里错了. UCenter 通信失败 和 无法同步登陆的调试方法,布布扣,bubuko.com

ucenter 同步登录总结

部署: discuz默认安装后就安装了uc_server应用 各应用根目录必须有uc_client文件夹. 下载ucenter程序查看范例程序 应用管理中,应用的主 URL必须指向到应用的根目录,应用接口文件名称,不含路径,默认为uc.php(默认在根目录的api目录下),从而程序会组成 http://localhost/api/uc.php 地址 应用的 UCenter 配置信息:最好和程序中的 config_xxx.php 文件对比下是否是程序自动生成的内容. 可能遇到的问题如下: Disc

discuz+java 同步登陆的整合?

服务器采用tomcat(主网站)和apache(discuz)服务器,利用discuz-ucenter-api-for-java 实现了官网登陆后论坛可以同步登陆,而论坛先登陆时,网站无法自动登陆,求高手帮忙指导下 QQ: 71375753 ,如有熟悉这块内容者,请加QQ联系

phpcms v9和discuz X3.1实现同步登陆退出论坛(已实现)

网络上文章很多,按步骤配置好了之后phpcms可以同步登录dz,但是dz登录后状态却无法同步到phpcms,网络上找了很多资料都大同小异,头大.只能自己调试了,废话不多说了. 以下网络上抄的安装步骤,留着自己用,有安装过的可跳过. 第一步:安装 phpcms V9 .安装 Discuz! X3.1 (同时安装 UCenter). 第二步:在 UCenter 中添加“phpsso 应用”. 1.管理员登录 Discuz! X3.1 管理中心,进入“UCenter”,点击“应用管理”.     2.

phpcms 2008和discuz X3.1实现同步登陆退出论坛(已实现)

网络上文章很多,按步骤配置好了之后phpcms可以同步登录dz,但是dz登录后状态却无法同步到phpcms,网络上找了很多资料都大同小异,头大.只能自己调试了,废话不多说了. 以下网络上抄的安装步骤,留着自己用,有安装过的可跳过. 第一步:安装 phpcms V9 .安装 Discuz! X3.1 (同时安装 UCenter). 第二步:在 UCenter 中添加"phpsso 应用". 1.管理员登录 Discuz! X3.1 管理中心,进入"UCenter",点

UCENTER同步登录工作原理和配置要点

ucenter的同步登录原理: 1)Ucenter是和uc_client同步的.每个PHP应用,加入了UCENTER后,都会在主目录下有个UC_CLIENT目录.这个目录里,都有一个client.PHP. 2)以我的应用例子来说,我的ecshop系统和discuz系统都加入了ucenter.则ecshop登录时,user.php中的login会检查配置文件,并根据配置最终调用uc_client\client.php中的uc_user_synlogin. 3)uc_user_synlogin会调用

ASP.NET整合Discuz!NT3.5实例说明(含用户登录、评论等)

http://bbs.51aspx.com/showtopic-30029.html#230540 前一阵想做一个团购导航网站,看到某些团购导航站都有论坛,自己也想加一个,研究了下Discuz!NT,发现有API接口,就忽然想到了用Discuz!NT来整合网站,岂不是很方便,会员那部分就不需要自己开发了. 说干就干,下来API的例子和开发包研究了一下,看了一遍仍然是一头雾水,不知道是不是自己太笨.而且发现API还有错误,来官方论坛求助貌似没有得到回答,看来还是只能靠自己啊.看了N遍终于明白了大概