不争气的Discuz!NT 3.6和MVC3整合,主要实现同步登录和注册,登出。

 由于主站采用的用户系统是微软内置的Membership类。所以密码这块就不能够实现统一。不过这并不影响,因为dz论坛在后台的“扩展”--》"整合设置"已经给我提供了相关“服务”。

 首先把论坛程序放在主站的一个bbs文件夹里面(论坛是以虚拟目录的形式安装的)。然后在iis里面找到主站,新建虚拟目录。选择对于的bbs文件夹即可。dz论坛的安装可参照。http://faq.comsenz.com/viewnews-989

dnt配置文件修改好数据库链接和论坛地址之后,还要把论坛的bll复制到主站的bin里面。网站安装好之后如果首页是空白的,可以进入后台。这时要修改DNT.config文件

<Forumpath>/</Forumpath>为<Forumpath>/虚拟目录名称/</Forumpath>。

这样整个论坛的搭建就已经完成了。接着就开始整合了。

1.首先进入管理后台-》扩展=》整合设置,开启论坛整合

2.在主站的app_code新建一个类:DiscuzToolkitUtil,注意添加discuztoolkit的引用:using Discuz.Toolkit;
public static class DiscuzToolkitUtil
    {
        public static string api_key,secret_key,webserver;
        private static bool IsInitObject = false;
        public static DiscuzSession ds;
        static DiscuzToolkitUtil()
        {
            if (!IsInitObject)
            {
                api_key = ConfigurationManager.AppSettings["DNTAPIKey"];
                secret_key = ConfigurationManager.AppSettings["DNTSecert"];
                webserver = ConfigurationManager.AppSettings["DNTWebServer"];
                ds = new DiscuzSession(api_key, secret_key, webserver);
                IsInitObject = true;
            }
        }
        public static DiscuzSession InitDiscuzSession()
        {
            return ds;
        }
    }

 3.添加web.config中的配置:
<!--DNTAPI码-->
    <add key="DNTAPIKey" value="9b96f217f65f510f647a97c47934659e" />
    <!--DNT密钥-->
    <add key="DNTSecert" value="bc9a7df4dbe407d089a07bd551125b1e" />
    <!--DNT服务器API地址-->
    <add key="DNTWebServer" value="http://localhost:8014/bbs/" />//这个地址其实就是论坛的地址

 4.开始做上面配置的那个async_receiver.aspx,这个是论坛登录或注册之后,发送消息给主站,让主网站也登录或注册
在自己的 网站项目中新建一个webform:async_receiver.aspx这个也要添加引用:using Discuz.Toolkit;
并加入如下代码:

  DiscuzSession ds;
        //dkcms2.Models. = new User();//自己网站的用户逻辑类
        protected void Page_Load(object sender, EventArgs e)
        {
            #region 论坛注册  这里的action一共有三种值 register ,login,logout,代表注册,登录和退出
            if (Request.QueryString["action"] != null)
            {
                //bool zhangtai = false;
                string user_roel = "";
                //通知注册  这里的注册暂时不能实现,因为传过来的密码是md5加密过的,dz未提供解码的方法,所以我的做法是论坛的注册页面和主站用一个页面。
                if (Request.QueryString["action"].ToString() == "register")
                {
                 
                    if (Request.QueryString["user_name"] != null && Request.QueryString["user_name"].Trim() != "" && Request.QueryString["password"] != null && Request.QueryString["password"].Trim() != "")
                    {

                        RegisterModel modelR = new RegisterModel();
                        modelR.UserName = Request.QueryString["user_name"];
                        int useridsf = Discuz.Forum.Users.GetUserId(modelR.UserName);
                      // Discuz.Toolkit.User dnt_user = ds.GetUserInfo(useridsf);
                       
                        modelR.Password = Request.QueryString["password"];
                      //modelR.Password=dnt_user.Password;
                      modelR.Email = Request.QueryString["email"];
                        MembershipCreateStatus createStatus;
                        MembershipUser user = Membership.CreateUser(Request.QueryString["user_name"], modelR.Password, modelR.Email, null, null, true, null, out createStatus);
                        //Request["roels"]="";
                        if (createStatus == MembershipCreateStatus.Success)
                        {

//自己的用户注册代码

Roles.AddUserToRole(modelR.UserName, user_roel);

                    }

                    }
                }
                #endregion
                //登录
                //通知登录
                if (Request.QueryString["action"].Trim() == "login")
                {
                    if (Request.QueryString["user_name"] != null && Request.QueryString["user_name"].Trim() != "" && Request.QueryString["uid"] != null && Request.QueryString["uid"].Trim() != "")
                    {

                        int dnt_userid = Convert.ToInt32(Request.QueryString["uid"]);//dnt论坛数据库的用户id
                        //Discuz.Toolkit.User dnt_user = ds.GetUserInfo(dnt_userid);//dnt论坛数据库的用户信息
                        string username=Request.QueryString["user_name"].Trim();

                                              //主站用户登录代码
                                              FormsAuthentication.SetAuthCookie(username, false);
                                         }
                }
                //退出
                if (Request.QueryString["action"].Trim() == "logout")
                {
                    FormsAuthentication.SignOut();

                }
              

            }
        }

5.以上只是论坛的登录和注册,退出的时候主站同步登录,注册,退出,反之的实现方法。

//以下是dnt登录
                    DiscuzSession ds = DiscuzToolkitUtil.InitDiscuzSession();
                    int dnt_uid = ds.GetUserID(model.Account);
                    ds.Login(dnt_uid, password, true, 30, "");

//以下是discuz注册
            int discuz_uid = 0;
            DiscuzSession ds = DiscuzToolkitUtil.InitDiscuzSession();
            try
            {
                discuz_uid = ds.Register(model.Account, model.Password, model.Email, true);//注册成功后返回discuz论坛的用户ID
            }
            catch (DiscuzException d)
            {
                if (d.ErrorCode == 109)//109是论坛设置了不允许注册,具体的可以看官方api文档,或者直接看下载的那个discuztoolkit源码
                {
                    Response.Write("alert('" + d.ErrorMessage + "');history.back();");
                    Response.End();
                }
            }
            if (discuz_uid == 0)
            {
                Response.Write("alert('注册失败');history.back();");
                Response.End();
            }

//等dnt论坛注册成功后,下面是自己网站的注册
//自己网站的注册代码

这样就简单的实现用户同步注册和登录 ,退出了。

由于是初次整合dz,所用的方法不一定是最好的,那里写的不好的还请指正.

原文地址:https://www.cnblogs.com/Playfunny/p/2726293.html