基本信息
源码名称:Asp.Net 实现与 Ucenter通信,整合后可实现账号同步登陆、登出
源码大小:3.52KB
文件格式:.rar
开发语言:C#
更新时间:2014-04-03
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍


using System;
using System.Security.Cryptography;
using System.Text;

/// <summary>
/// c#与discuz的passport整合事例
/// 请保留以下信息以备出现问题时使用
/// 整合贡献:huozhe3136 QQ:2666556
/// 调试工具:Microsoft Visual Web Developer 2005
/// </summary>
public partial class _Default : System.Web.UI.Page {
    //------------------------需要修改的设置---------------------------------
    string webUrl           = "http://localhost:1627/webapp/Default.aspx";//这里修改为你的测试主站的地址,不要缺少最后的'/'号
    string dzUrl            = "http://localhost:8080/discuz/";//这里修改为你的dz地址,不要缺少最后的'/'号
    string dzPassportKey    = "1234567890";//这里修改为你的dz后台通行证设置里的possportkey
    string dzForward        = "";
    string dzAuth           = "";
    string dzVerify         = "";



    protected void Page_Load(object sender, EventArgs e){
        dzForward = Request.QueryString["forward"];
        if (Request.QueryString["act"] == "logout") logout();
        if(Session["username"]!=null) Response.Write(Session["username"].ToString()  "登陆成功! <a href=\"default.aspx?act=logout\">点击这里退出登陆</a> <a href=" dzUrl " target=_blank>访问论坛</a><br>");
    }

    protected void logout(){
        Session["username"] = null;
        dzForward           = Request.QueryString["forward"];//获取返回地址
        if (dzForward == "") dzForward = webUrl;//如果返回地址为空,则返回设置的页
        dzVerify            = md5("logout"   dzForward   dzPassportKey);
        dzForward           = Server.UrlEncode(dzForward);
        Response.Redirect(dzUrl   "api/passport.php?action=logout&auth=&forward="   dzForward   "&verify="   dzVerify);
            
    }


    protected void Button1_Click(object sender, EventArgs e){
        string postUsername;
        string postPwd;
        postUsername        = username.Text.ToString().Trim();
        postPwd             = password.Text.ToString(); 

        if(postUsername=="admin" && postPwd=="123456"){
            Session["username"]=postUsername;//设置主站自身的cookie或session;

            //---------------------------passport注册或登陆整合开始-----------------------------
            string memberInfo = "username="   postUsername
                          "&password="   md5(postPwd)
                          "&time="  time()//获取当前时间与格林威治的秒差
                          "&email=" "abc@abc.com";//需要email的值,实际整合通常情况是从数据库里获取用户email
            dzAuth          = passport_encrypt(memberInfo , dzPassportKey);
            dzForward       = forward.Value.ToString().Trim();//获取返回地址
            if(dzForward=="") dzForward = webUrl;//如果返回地址为空,则返回设置的页
            dzVerify        = md5("login"   dzAuth   dzForward   dzPassportKey);
            dzAuth          = Server.UrlEncode(dzAuth);
            dzForward       = Server.UrlEncode(dzForward);
            Response.Redirect(dzUrl   "api/passport.php?action=login&auth="   dzAuth   "&forward="   dzForward   "&verify="   dzVerify);
            //---------------------------passport注册或登陆整合结束-----------------------------
        }else Response.Write("登陆失败<br>");
    }


    //------------------------------------以下为一些关键函数------------------------------
    // 将字符串转换为byte数组     
    public byte[] strToByteAry(string str){
        return Encoding.Default.GetBytes(str);
    }
    
   // c# dz通信证编码函数
   public string passport_encrypt(string txt, string key){
        byte[] randomNumber = new byte[1];
        RNGCryptoServiceProvider Gen = new RNGCryptoServiceProvider();
        Gen.GetBytes(randomNumber);
        int rand = Convert.ToInt32(randomNumber[0]);
        string encrypt_key = md5(rand.ToString());

        byte[] txtAry = strToByteAry(txt);
        byte[] encryAry = strToByteAry(encrypt_key);
        int j = 0;
        int ctr = 0;
        byte[] tmp = new byte[2 * txtAry.Length];
        for (int i = 0; i < txtAry.Length; i  )
        {
            ctr = ctr == encryAry.Length ? 0 : ctr;
            tmp[j  ] = encryAry[ctr];
            tmp[j  ] = xor(txtAry[i], encryAry[ctr  ]);
        }
        return Convert.ToBase64String(passport_key(tmp, key));
    }

    
    // c# dz通行证解码函数
    public string passport_decrypt(string txt, string key){
        byte[] t = Convert.FromBase64String(txt);
        byte[] btxt = passport_key(t, key);
        byte[] btmp = new byte[btxt.Length];
        int j = 0;
        for (int i = 0; i < btxt.Length; i  , j  )
            btmp[j] = xor(btxt[i], btxt[  i]);
        return Encoding.Default.GetString(btmp);
    }


    
    // c# dz通行证密匙处理函数    
    public byte[] passport_key(byte[] btxt, string key){
        key = md5(key);
        byte[] keyAry = strToByteAry(key);
        int ctr = 0;
        byte[] tmp = new byte[btxt.Length];
        for (int i = 0; i < btxt.Length; i  ){
            ctr = (ctr == keyAry.Length) ? 0 : ctr;
            tmp[i] = xor(btxt[i], keyAry[ctr  ]);
        }
        return tmp;
    }

    
    // 针对byte的异或     
    public byte xor(byte a, byte b){
        return Convert.ToByte(a ^ b);
    }
    
    // 获取UNIX时间戳    
    public string time(){
        DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
        DateTime dtNow = DateTime.Parse(DateTime.Now.ToString());
        TimeSpan toNow = dtNow.Subtract(dtStart);
        string timeStamp = toNow.Ticks.ToString();
        timeStamp = timeStamp.Substring(0, timeStamp.Length - 7);
        return timeStamp;
    }

    
    // md5加密
    public string md5(string str){
        MD5 md5Hasher = MD5.Create();
        string re="";
        byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(str));
        for (int i = 0; i < data.Length; i  )
            re  = data[i].ToString("x2");        
        return re;
    }
}