Discuz!NT官方社区

首页 » Discuz!NT开发与测试 » Discuz!NT整合 » ASP整合Discuz!NT用户登录范例
雪人 - 2007-4-18 15:56:00
相关参考:

asp.net调用Discuz!NT方法实现用户整合登陆:
http://nt.discuz.net/download/doc/dnt_2_userapidoc.zip

与开发语言无关的用户整合登陆:
http://nt.discuz.net/doc/default.aspx?cid=135

======================================================

用途: 假设asp网站原有一个用户数据库 (下文称为原数据库),安装Discuz!NT后,你直接修改原来的注册用户程序,让用户注册后同时将用户信息添加到原数据库和Discuz!NT的数据库. 现在希望用户登录一次即可同时登录原网站和Discuz!NT论坛,而你又只熟悉asp的话,即可以此asp脚本稍作修改,来作为用户的一次登录程序使用.

更新时间: 2007-4-18


这个范例仅提供给网站现有部分功能为asp, 且不熟悉asp.net的朋友使用. 如果你的网站是asp.net且你对asp.net略有了解, 那当然就不要考虑陈旧的asp了.

需要的朋友看下, 有什么意见建议提出来, 逐步改进.










以下为login.asp的内容:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>用户登录</title>
</head>
<body>

<%
Rem ==============参数设置开始================

Rem ==========================================
Rem  设置论坛Url地址,请根据你的实际情况修改
Rem  注意只要目录,不要文件名,例如:
Rem  正确用法: [url]http://www.abc.com/bbs[/url]
Rem  错误用法: [url]http://www.abc.com/bbs/index.aspx[/url]
Rem ==========================================
url_dnt = "http://www.abc.com/bbs"
Rem ==========================================
Rem  设置Discuz!NT登录完毕后返回的Url地址,请根据你的实际情况修改
Rem ==========================================
url_return = "http://www.abc.com/main.asp"

Rem ==============参数设置结束================
%>

<form name="dntloginform" method="post" action="#">
  <input name="username" type="hidden" id="username" />
  <input name="password" type="hidden" id="password" />
  <input name="question" type="hidden" id="question" />
  <input name="answer" type="hidden" id="answer" />
</form>
<script language="javascript"> 
function postdntloginform(username, password, question, answer) 

  document.dntloginform.action="<%=url_dnt%>/login.aspx?reurl=<%=%>"; 
  document.dntloginform.username.value=username;
  document.dntloginform.password.value=password;
  document.dntloginform.question.value=question;
  document.dntloginform.answer.value=answer;
  document.dntloginform.submit(); 

</script>

<%
if request("username")<>"" then
strUsername = request("username")
strPassword = request("password")
strQuestion = request("question")
strAnswer = request("answer")
Rem ==========================================
Rem 函数ChkUserLogin检查你原数据库用户名字密码,根据用户名和密码判断后返回true或false(真或假)
Rem 具体的判断请根据你的实际情况修改后面的ChkUserLogin函数内容
Rem ==========================================
if ChkUserLogin(strUsername, strPassword) then
  response.write "<" & "script language=javascript>postdntloginform('" & Server.URLEncode(strUsername) & "','" & Server.URLEncode(strPassword) & "','" & Server.URLEncode(strQuestion) & "','" & Server.URLEncode(strAnswer) & "');</script" & ">"
  response.end
end if

response.write "<" & "script language=javascript>alert('帐号错误,请重新输入');</script" & ">"

end if
Rem ==========================================
Rem 函数ChkUserLogin检查你原数据库用户名字密码
Rem 以下程序中需要你根据实际情况修改数据库连接串和原用户表名以及用户和密码字段名
Rem ==========================================
function ChkUserLogin(strUsername, strPassword)

ChkUserLogin = false

set conn = server.createobject("adodb.connection")
Rem ==========================================
Rem  出于SQL安全考虑, 将“'”替换为“''”
Rem ==========================================
strUsername = replace(strUsername, "'", "''")

Rem ==========================================
Rem  连接原数据库
Rem ==========================================
conn.open "provider=microsoft.jet.oledb.4.0;data source=d:\web\abc\db.mdb"
Rem ==========================================
Rem 如果是SQLServer数据库就类似于:
Rem conn.open "DRIVER={SQL Server};SERVER=ServerName;UID=USER;PWD=password;DATABASE=databasename"
Rem ==========================================

Rem ==========================================
Rem  查找符合用户名的记录
Rem ==========================================
set rs = conn.execute("SELECT TOP 1 [password] FROM [] WHERE [username]=" & strUsername)
if not(rs.bof or rs.eof) then
  Rem ==========================================
  Rem 如果存在该用户名则判断用户密码是否正确
  Rem 这里strPassword为密码明文
  Rem 如果数据库库中存储的密码是进行过处理后的(例如MD5加密),则请进行相应修改,例如:
  Rem if rs(0) = MD5(strPassword) then
  Rem ==========================================
  if rs(0) = strPassword then
    ChkUserLogin = true
  end if
end if
end function
%>
<form id="form1" name="form1" method="post" action="">
  <table width="500" border="0" align="center" cellpadding="4" cellspacing="1" bgcolor="#F9F9F9">
    <tr>
      <td colspan="2" align="center" bgcolor="#CCCCCC">用户登录</td>
    </tr>
    <tr>
      <td width="30%" align="right">用户名:</td>
      <td width="70%"><input name="username" type="text" id="username" size="20" /></td>
    </tr>
    <tr>
      <td align="right">密码:</td>
      <td><input name="password" type="text" id="password" size="20" /></td>
    </tr>
    <tr>
      <td align="right">安全问题:</td>
      <td><select name="question" id="question">
          <option value="0" selected="selected">无</option>
          <option value="1">母亲的名字</option>
          <option value="2">爷爷的名字</option>
          <option value="3">父亲出生的城市</option>
          <option value="4">您其中一位老师的名字</option>
          <option value="5">您个人计算机的型号</option>
          <option value="6">您最喜欢的餐馆名称</option>
          <option value="7">驾驶执照的最后四位数字</option>
        </select>
      </td>
    </tr>
    <tr>
      <td align="right">答案:</td>
      <td><input name="answer" type="text" id="answer" size="20" /></td>
    </tr>
    <tr>
      <td> </td>
      <td><input type="submit" name="Submit" value="登 录" /></td>
    </tr>
  </table>
</form>
</body>
</html>


雪人 - 2007-4-18 16:02:00
几点补充:

1 头部的<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>很重要, 设置codepage为65001即设置页面编码为utf-8, 因为Discuz!NT的页面编码为utf-8, 这样传递参数避免出现编码不同导致错误.

2 本整合登录方案的原理是: 先用asp代码接受用户提交的信息, 然后以原数据库的用户表判断是否正确, 如果正确再以假的表单方式提交给Discuz!NT的login.aspx, 同时给login.aspx一个reurl参数, Discuz!NT的login.aspx判断用户如果成功会返回reurl里提供的地址.

3 需要在Discuz!NT管理员后台的"Discuz!NT选项" - "安全控制"里去掉登录的验证码
roberto - 2007-4-18 16:02:00
这个有什么用啊?

类似的东西早有人弄出来过,你也放过一个类似的htm文件。
我想现在大家需要这样一个东西:

用户输入用户名。密码,点击登录后需要写入那些cookies,
这样不需要到论坛的登录界面登录,这个才是最重要的。
roberto - 2007-4-18 16:05:00
反正你们就是不准备直接提供这个了!
还是要到你这边转来转去。
雪人 - 2007-4-18 16:15:00
楼上的, 你要的不就是等一次跳转写入原有的用户cookie和discuz!nt的cookie吗?这个方法能达到目的。

但asp要生成discuz!nt的cookie太麻烦了,不仅有加密算法还有utf-8转码,其中还要取discuz!nt的几个设置,还有,以后discuz!nt我们一旦更改cookie加密算法或对cookie有调整,用户的整合登录就会作废,因此这个办法相对比较有通用性。
雪人 - 2007-4-18 16:17:00


引用:
原帖由 roberto 于 2007-4-18 16:02:00 发表
这个有什么用啊?

类似的东西早有人弄出来过,你也放过一个类似的htm文件。
我想现在大家需要这样一个东西:

用户输入用户名。密码,点击登录后需要写入那些cookies,
这样不需要到论坛的登录界面登录,这个......


现在这种方式不是那种htm,也不需要到论坛登录界面,发言之前先看仔细。
jee - 2007-4-18 16:29:00
是想要动网 以前的那种登录接口吧
jee - 2007-4-18 16:34:00
就是那种 <接口代码 一般为javascirpt>  然后在用户的页面上 就出现一个登录窗口 方面用户调用 asp写cookies也不麻烦啊 可以用.net做一个登录接口 用户验证用户登录信息 如果对 返回给asp页面一个值 如果不对 返回另一个值 不过这样做 不会对原来系统有任何影响 不过 这样用户登录信息 在两个页面传输的时候 就要加密了

打个比方 就想登录QQ邮箱 点击QQ 就可以登录自己的邮箱 不用用户输入信息 其实用户的用户名 和 密码 是包含在URL里面的 雪人可以考虑这个方法的 我的很多项目都是这么做的

这样可以对两个方面的影响减到最少
xewnwsl2001 - 2007-4-18 17:41:00
刚发的嘛
xewnwsl2001 - 2007-4-18 17:41:00
晕,楼上的抢了两个位置
Croaker - 2007-4-18 17:53:00
晕,

不能下载.
Croaker - 2007-4-18 18:00:00
最好是asp直接写cookies的.这样方便呀.

asp.net 的论坛cvbbs给出过用asp直接写cookies的方法.

还有如果论坛和网站用的是二级玉名.如:www.xxxxxx.com  网站  bbs.xxxxxxx.com 论坛

注册\登陆\退出 都需要统一的呀.

雪人管理员很辛苦,我们大家都应该理解.


但需要给我们一个好的解决方法.

动网也出asp.net和好像直接和cvbbs合作的.
雪人 - 2007-4-18 18:04:00
地址修改过了

不直接用asp代码写cookie的原因我在5楼说了
abc54288 - 2007-4-18 18:43:00
:) :) :)
情迷戈壁滩 - 2007-4-18 23:47:00
看看吧 以后也许有的到
mage - 2007-4-19 8:10:00
那如果是ASP.NET跟DiscuzNT!呢?
可以給個方向嗎..
我可以直接用DiscuzNT的註冊頁面跟登入頁面 共用嗎?

還是說要自己弄一個 ?
roberto - 2007-4-19 11:07:00


引用:
原帖由 雪人 于 2007-4-18 16:17:00 发表
现在这种方式不是那种htm,也不需要到论坛登录界面,发言之前先看仔细。


按我的理解,都差不多的。
不提供直接写cookies的方法有什么好处呢?

1:好像安全一点,但实际上不是的,被逼得没办法的人迟早
会看代码,会告诉其他人,比如现在我有这个想法;
2:比较让支持者不爽,这个东西有那么重要吗?麻烦的是用discuz的人,而不是其他人,
想搞乱子的人总是搞得出来的。
3:不同的开发者都要到调用你的login处理,不是不行,还是麻烦。

提供直接写cookies的方法有什么好处呢?
1:md5大把,找个第三方的大家都可以处理;
2:不麻烦,想怎么控制自己的,就可以控制;
3:采用其他任何语言的都可以和这个集成。

我个人觉得你们公司不大,但是反应其实还是很慢,号称
是从事互联网业务的公司,其实很多东西想法还是很像地主老财的,
所以,我觉得戴老板也就只能写个论坛什么的,想玩点概念,
要再搞大也很难了。
poiucn - 2007-4-19 21:30:00
要支持一上,不管怎么讲我们现在不能太挑,,,毕竟大家都很忙,雪人辛苦了
frtime - 2007-4-20 9:46:00
有来晚了啊
sanshor - 2007-4-21 6:04:00
学习下姐姐的文章先~
waker - 2007-4-22 22:46:00
修改密码咋办???
zpzcc - 2007-4-23 8:21:00
KK,也许用的到。。
liujie3308 - 2007-4-26 10:37:00
标记一下
chenymail - 2007-5-8 16:24:00
有没有.net的代码?
chenymail - 2007-5-11 0:52:00
asp.net里面怎么写啊
syc958 - 2007-5-21 9:22:00
我想知道和.net网站整合的方法!雪人大哥可否指教一下!
ykx95301 - 2007-5-23 15:25:00
请问雪人,我的主站是.net2.0的,现在用上了ntdiscuz,我改怎么做整合?
请指教!
请详细一些~~谢谢雪人,谢谢各位朋友~`请告之
wang1 - 2007-5-29 15:27:00
如在願網站上,有一登陸名、密碼、驗證碼(它是調用discuz!nt登陸的驗證碼),表單中atcion="http://mybbs/login.aspx",這樣出現了問題,驗證碼總是判斷不對。如果把驗證碼功能關閉,則能成功。
(說明,願網站與discuz!nt論壇不在同一站點上)
求解??????????
pbdq - 2007-5-30 15:20:00
非常不错,很喜欢。
zhaojicheng - 2007-6-1 14:18:00
哈正好用到
123
查看完整版本: ASP整合Discuz!NT用户登录范例