现在大多数网站都有自己的论坛,基本上的就是动网和社区动力,他们都是可以使用一站式登陆.最近做了2个网站,都是使用社区动力作为自己的论坛,一站式登陆的.有点体会,拿出来侃侃~~~~~~~~~~~
我采用的社区动力asp.net版本的.采用md5加密的.对于一站式登陆,数据库有2份,一份是网站的数据库,一份是论坛的数据库,所以无论是在论坛上注册还是在网站上注册,都是必须在网站的数据库和论坛的数据库插入一条记录的.登陆也一样,无论是在论坛上登陆,还是在网站上登陆都是要完成一个工作的,就是在一个地方等论,2个地方都应该已经变成登陆状态了.
现在开始解决上面2个问题.
我们都知道,社区动力的注册是通过调用一个存储过程dnt_createuser建立一个新用户的.bbs的用户表dnt_users的id号是自增的.我们现在的任务是我们自己来调用这个存储过程来为bbs建立新用户.网站自己会有一张注册页面的,也许风格和bbs的不同,所以你也可以再建立一张页面,来与bbs的风格相同,就是bbs的注册就在那种页面,而网站的注册就调用网站的注册页面..这个只是风格的问题,而后台的处理都是一样的,就是往网站和bbs的数据库中插入一条记录.如何设计网站的用户表,最好是考虑论坛和自己的网站双方面需要,这样比较好.当我们填完资料并且点击注册时候,触发的事件就是完成上面2个动作.
第1步骤,最好先注册到网站的数据库中去,然后返回id号;当然也可以先注册到bbs的数据库.所以这里有2个数据库的操作,你的web.config就是2个连接数据库的字符串这里面有个约束,bbs的登陆要用到用户的id号,所以2个数据库中的用户表的id号是必须相对应的.所以后注册的那个数据库的表的id号是根据第一个表的id号来生成的.我采用的是先注册到网站的.所以要修改bbs的数据库中的表和存储过程.
主要修改如下:
我添加了一个参数@userid,就是给id号赋值的.

INSERT
INTO
[
dnt_users
]
(
[
uid
]
,
[
username
]
,
[
nickname
]
,
[
password
]
,
[
secques
]
,
[
gender
]
,
[
adminid
]
,
[
groupid
]
,
[
groupexpiry
]
,
[
extgroupids
]
,
[
regip
]
,
[
joindate
]
,
[
lastip
]
,
[
lastvisit
]
,
[
lastactivity
]
,
[
lastpost
]
,
[
lastpostid
]
,
[
lastposttitle
]
,
[
posts
]
,
[
digestposts
]
,
[
oltime
]
,
[
pageviews
]
,
[
credits
]
,
[
extcredits1
]
,
[
extcredits2
]
,
[
extcredits3
]
,
[
extcredits4
]
,
[
extcredits5
]
,
[
extcredits6
]
,
[
extcredits7
]
,
[
extcredits8
]
,
[
avatarshowid
]
,
[
email
]
,
[
bday
]
,
[
sigstatus
]
,
[
tpp
]
,
[
ppp
]
,
[
templateid
]
,
[
pmsound
]
,
[
showemail
]
,
[
newsletter
]
,
[
invisible
]
,
[
newpm
]
,
[
accessmasks
]
)
VALUES
(
@userid
,
@username
,
@nickname
,
@password
,
@secques
,
@gender
,
@adminid
,
@groupid
,
@groupexpiry
,
@extgroupids
,
@regip
,
@joindate
,
@lastip
,
@lastvisit
,
@lastactivity
,
@lastpost
,
@lastpostid
,
@lastposttitle
,
@posts
,
@digestposts
,
@oltime
,
@pageviews
,
@credits
,
@extcredits1
,
@extcredits2
,
@extcredits3
,
@extcredits4
,
@extcredits5
,
@extcredits6
,
@extcredits7
,
@extcredits8
,
@avatarshowid
,
@email
,
@bday
,
@sigstatus
,
@tpp
,
@ppp
,
@templateid
,
@pmsound
,
@showemail
,
@newsletter
,
@invisible
,
@newpm
,
@accessmasks
)
SELECT
SCOPE_IDENTITY
()
AS
'
userid
'
SET
@uid
=
SCOPE_IDENTITY
()

IF
@@ERROR
=
0
BEGIN
UPDATE
[
dnt_statistics
]
SET
[
totalusers
]
=
[
totalusers
]
+
1
,
[
lastusername
]
=
@username
,
[
lastuserid
]
=
@userid
END

INSERT
INTO
dnt_userfields
(
[
uid
]
,
[
website
]
,
[
icq
]
,
[
qq
]
,
[
yahoo
]
,
[
msn
]
,
[
skype
]
,
[
location
]
,
[
customstatus
]
,
[
avatar
]
,
[
avatarwidth
]
,
[
avatarheight
]
,
[
medals
]
,
[
bio
]
,
[
signature
]
,
[
sightml
]
,
[
authstr
]
)
VALUES
(
@userid
,
@website
,
@icq
,
@qq
,
@yahoo
,
@msn
,
@skype
,
@location
,
@customstatus
,
@avatar
,
@avatarwidth
,
@avatarheight
,
@medals
,
@bio
,
@signature
,
@sightml
,
@authstr
)

在第一个insert语句中加入[uid]和@userid
在update语句中修改成了[lastuserid]=@userid
在最下面的insert语句修改了value下面的@userid
最后把用户表的自增去掉就好了.
比较简单.
现在前期工作都做好了,现在点击注册,调用web.config里面的网站的数据库链接字符串,把用户信息写入到数据库中去,并返回相应的id号.然后再到web.config取bbs的链接字符串,,把用户信息和刚才返回的id号传给存储过程dnt_createuser,执行存储过程.这样就完成注册了.
下面开始解决登陆问题
登陆象上面也可以有2张页面,就是风格问题,不说了.现在主要关心后台的问题了.当输入用户名密码登陆成功后,登陆时我是先调用网站的数据库进行验证的.登陆成功后,网站的已经登陆了,那么bbs怎么登陆的.社区动力提供的登陆语句如下:
ForumUtils.WriteUserCookie ( System.Int32 uid , System.Int32 expires , System.String passwordkey )
OnlineUserFactory.UpdateAction(
1
, Discuz.Forum.UserAction.Login.ActionID,
0
);
第一条语句的第1个参数是用户的id号,第二个是session保存时间,第3个可以在论坛的配置文件general.config中找到.所以我们要把用户登陆后的id号传到bbs上才可以登陆,所以我们要自己新建一个项目.用来接受id号并且使用这段代码来登陆论坛.

上面的是我的项目:
说明一下:
login.aspx,register.aspx,usercpnewpassword.aspx是用来覆盖论坛login.aspx,register.aspx,usercpnewpassword.aspx的的,并且转向你们定义的各自登陆页面和注册页面.
SetSession.aspx是用来接受id号执行登陆的.
我们的网站上都是有链接到论坛的.所以我们应该在这些链接到论坛上的都应该先链接到setsession.aspx然后判断是否是已经登陆了.就是setsession.aspx作为中转页面的.
最后我们把这个项目的dll放到bbs的bin目录下,把aspx页面放到bbs的aspx目录下子目录1的下面.覆盖bbs的aspx页面.
这样就可以了,,因为水平有限和时间参促.写的不怎么好,权当抛砖引玉吧!!!!!!!!!!!!!!!!!