本帖最后由 jack.ling 于 2014-7-15 10:51 编辑
我的源码:
using System;
using System.Security.Cryptography;
using System.Text;
public partial class _Default : System.Web.UI.Page {
//------------------------需要修改的设置---------------------------------
string webUrl = "http://192.168.1.103/webapp/";//这里修改为你的测试主站的地址,不要缺少最后的'/'号
string dzUrl = "http://192.168.1.103/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=="130425")
{
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);
//string sendUrl = dzUrl + "api/passport.php?action=login&auth=" + dzAuth + "&forward=" + dzForward + "&verify=" + dzVerify;
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, 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, 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 = xor(btxt, 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.ToString("x2");
return re;
}
}
我的论坛的通行证的设置:
总是登录后,选择跳转到论坛的主页,论坛主页没有显示登录的用户。
请大神指导一下 ,我的QQ:305244129;万分感谢 !
|