今天的工作主要是解决 Asp.net Froums 与网站同步登陆的问题
我想过很多办法:
第一个办法是发xml包,调试的时候报错:“远程服务器返回错误: (401) 未经授权” 上网查了一下说什么密码不同步 ,肯定一时半会弄不好! !!( 放弃之)
第二个办法想到webservice不过上网一查有url传参的现成方法简单实用就用它了。下面详细介绍一下,希望对大家能起点抛砖引玉的作用。
注册和修改密码很简单不用带url传值,直接一次插2个user表就行。
下面的代码意思是网站注册和修改密码时候同时注册和修改Forum表:
#region 注册Forum会员
public void Insertforums_Users()
{
try
{
//插入forums_User表
SqlConnection myConnection=new SqlConnection(ConfigurationSettings.AppSettings["BBSConnectionString"]);
string passwordmd5=Common.CommonClass.MD5(PassWord);
string sqlstr=@"insert into forums_Users (UserName,PassWord,Email,NickName)
Values('"+UserName+"','"+passwordmd5+"','"+this.Email+"','"+this.UserName+"') SELECT @@IDENTITY AS 'NewUserID'";
SqlDataAdapter myDA=new SqlDataAdapter(sqlstr,myConnection);
myConnection.Open();
myDA.Fill(this.myDS,"Users");
if(this.myDS!=null)
{
this.ForumUserID=this.myDS.Tables[0].Rows[0][0].ToString();
}
//插入forums_UserProfile表
sqlstr="insert into forums_UserProfile (UserID) Values ('"+this.ForumUserID+"')";
SqlCommand myCommand = new SqlCommand(sqlstr,myConnection);
myCommand.CommandType = CommandType.Text;
myCommand.ExecuteNonQuery();
myConnection.Close();
}
catch(Exception ee)
{
throw ee;
}
}
#endregion
#region 更新Forum会员密码
protected void UpDateforums_User(string passWord)
{
try
{
//查找此网站用户的用户名
IStatement stmt=NDOManager.Instance .CreateStatement();
stmt.CommandText="select UserName from UserInfo where UserID=@UserID";
stmt.MakeInParam("@UserID",UserID);
DataRow dr = stmt.GetDataRow();
if(dr!=null)
{
UserName = dr["UserName"].ToString() ;
}
else
{
return;
}
//更新Forum论坛用户的密码
SqlConnection myConnection=new SqlConnection(ConfigurationSettings.AppSettings["BBSConnectionString"]);
string passwordmd5=Common.CommonClass.MD5(passWord);
string sqlstr="Update forums_Users Set PassWord='"+passwordmd5+"' Where UserName='"+this.UserName+"'";
SqlCommand myCommand=new SqlCommand(sqlstr,myConnection);
myCommand.CommandType=CommandType.Text;
myConnection.Open();
myCommand.ExecuteNonQuery();
myConnection.Close();
}
catch
{
}
}
#endregion
用户登陆和退出的时候用的方法是url传参(可以通过一个隐藏的ifram实现页面不跳转),接口页面被动接收。下面贴出代码
说明:由于头儿说传url时密码简单md5加密很不安全,所以又经过变态加密了,加密方法是MD5(用户名+加密以后的用户密码)由于想走microsoft的存储过程所以我这连接数据库连了2次
private void Page_Load(object sender, System.EventArgs e)
{
if(!this.Page.IsPostBack)
{
if(Request.QueryString["u"]!=""&&Request.QueryString["u"]!=null)
{
this.username=Request.QueryString["u"].ToString();
if(Request.QueryString["s"]!=""&&Request.QueryString["s"]!=null)
{
this.sysKey=Request.QueryString["s"].ToString();
this.login();
}
}
if(Request.QueryString["a"]!=""&&Request.QueryString["a"]!=null)
{
this.Logout();
}
}
}
public void login()
{
try
{
SqlConnection myConnection=new SqlConnection(ConfigurationSettings.AppSettings["SiteSqlServer"]);
string sqlstr=@"Select * from forums_Users where UserName='"+username+"'";
SqlDataAdapter myDA=new SqlDataAdapter(sqlstr,myConnection);
myConnection.Open();
myDA.Fill(this.myDS,"Users");
if(myDS!=null)
{
password=myDS.Tables[0].Rows[0]["Password"].ToString();
}
if(sysKey.ToLower()!=MD5(username+password))
{
return;
}
myConnection.Close();
User usertologin = new User();
usertologin.Username = username;
usertologin.Password = password;
ForumsDataProvider dp = ForumsDataProvider.Instance();
if(dp.ValidateUser(usertologin)>0)
{
FormsAuthentication.SetAuthCookie(usertologin.Username, true);
ForumContext.Current.Context.Response.Cookies[FormsAuthentication.FormsCookieName].Expires = DateTime.Now.AddDays(30);
}
}
catch
{
}
}
#region 退出
public void Logout()
{
FormsAuthentication.SignOut();
}
#endregion