网站同步登录到discuz(基于模拟登录)

作用:同步登录论坛,不用修改论坛代码

必须条件:网站与论坛必须在同一域名下,可以是不同二级域名;两边用户是一样的。

原理概述:网站登录成功后,POST提交账号密码到论坛,取得登录成功后返回的cookie,保存于一级域名下。

具体实现:

1.模拟登录获取cookie

用抓包工具(我用的是firefox的firebug)

打开firebug,登录论坛

可以看到,登录就是这个POST请求。

在firebug中可以看到请求地址,头信息和POST参数列表,然后模拟这个POST就行

2.保存cookie。保存cookie没什么好多说的,只说一点: 在二级域名下存cookie时,设置Domain属性为一级域名,会将cookie存于一级域名下,然后另外的二级域名可以访问此cookie。例如有 codingthink.com; bbs.codingthink.com;

v.codingthink.com三个域名。在bbs.codingthink.com中存了一个cookie,设置了Domain属性为 codingthink.com,那么v.codingthink.com就可以读取这个cookie。

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net;
using System.Text;
using System.IO;

    /// <summary>
    /// 论坛工具类
    /// </summary>
    public class DiscuzTools
    {
       
        private HttpContext context; //当前http上下文
        private string username;//用户名
        private string password;//密码
        private string postdata;//提交数据
        private string useragent;//浏览器信息
        private const string POST = "POST"; //请求方式
        private const string DOMAIN="http://localhost";//论坛所在域名
        //请求地址
        private const string POSTURL="/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1";
        //post数据的字符串格式
        private const string DATAFORMAT = "fastloginfield=username&username={0}&password={1}&quickforward=yes&handlekey=ls";
        //提交数据类型
        private const string CONTENTTYPE = "application/x-www-form-urlencoded";
        //保存cookie的域名
        private const string COOKIEDOMAIN = "localhost";
        //保存cookie路径
        private const string COOKIEPATH = "/";

        /// <summary>
        /// 实例化discuztools类,用于同步登录
        /// </summary>
        /// <param name="context"></param>
        /// <param name="postdata"></param>
        /// <param name="useragent"></param>
        public DiscuzTools(HttpContext context,string username,string password,string useragent)
        {
            this.context = context;
            this.postdata = string.Format(DATAFORMAT, HttpUtility.UrlEncode(username, Encoding.GetEncoding("gb2312")).ToUpper(), password);
            this.useragent = useragent;
        }
        /// <summary>
        /// 模拟登录论坛,获取cookie
        /// </summary>
        /// <returns></returns>
        private CookieCollection GetCookies()
        {
            try
            {
                HttpWebRequest request = null;
                HttpWebResponse response = null;
                CookieContainer cc = new CookieContainer();
                request = (HttpWebRequest)WebRequest.Create(DOMAIN+POSTURL);
                request.Method = POST;
                request.UserAgent = useragent;
                request.AllowAutoRedirect = false;
                request.CookieContainer = cc;
                request.KeepAlive = true;
                request.ContentType = CONTENTTYPE;
                byte[] postdatabyte = Encoding.UTF8.GetBytes(postdata);
                request.ContentLength = postdatabyte.Length;
                Stream stream;
                stream = request.GetRequestStream();
                stream.Write(postdatabyte, 0, postdatabyte.Length);
                stream.Close();
                response = (HttpWebResponse)request.GetResponse();
                CookieCollection cookies = request.CookieContainer.GetCookies(request.RequestUri);
                return cookies;
            }
            catch (Exception ex)
            {
                
                throw ex;
            }
        }

        /// <summary>
        /// 保存cookie,实现同步登录。
        /// </summary>
        /// <returns></returns>
        public bool SyncBBSLogin()
        {
            bool resul = true;
            try
            {
                CookieCollection cookies = this.GetCookies();
                foreach (Cookie cookie in cookies)
                {
                    HttpCookie c = new HttpCookie(cookie.Name, cookie.Value);
                    c.Domain = COOKIEDOMAIN;
                    c.Path = COOKIEPATH;
                    context.Response.AppendCookie(c);
                   // context.Response.Write(c.Name+"="+c.Value+"<br>");
                }
            }
            catch (Exception ex)
            {
                resul = false;
                throw ex;
            }

            return resul;
        }
    }

欢迎访问我的网站 编程思想

你可能感兴趣的:(网站同步登录到discuz(基于模拟登录))