小弟学习C#+ASP.NET编程,按照三层结构编写了一个简单的登录验证程序,但是有个问题始终无法理解,那就是我的Business类中可以获得数据库中的一条记录的全部字段信息,但是在验证类中丢失了username,该值为空,请高人指点一下,是哪里除了问题!谢谢!代码(Bussiness类)
using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections;
using System.Text;
using System.Security.Cryptography;
using System.Configuration;
using Betaone.Data;namespace Betaone.Business
{
/// <summary>
/// BizUser 的摘要说明。
/// </summary>
public class User:Betaone.Business.BusinessObject
{
public int id;
public string username;
public byte[] password;
public string division;
public byte[] question;
public byte[] answer;
/// <summary>
/// 
/// </summary>
public User():base()
{
id=-1;
} /// <summary>
/// 构造函数使用id创造新对象
/// </summary>
/// <param name="userid"></param>
public User(int userid):base()
{
id=-1;
LoadFromId(userid);
} /// <summary>
/// 构造函数使用用户名创建对象
/// </summary>
/// <param name="username"></param>
public User(string username):base()
{
id=-1;
Data.User dbuser=new Betaone.Data.User(connectionString);
Data.UserDetails user=dbuser.GedDetails(username);
if(user!=null)
{
id=user.id;
username=user.username;
password=user.password;
division=user.division;
question=user.question;
answer=user.answer;
} }
/// <summary>
/// 
/// </summary>
/// <param name="userid"></param>
private void LoadFromId(int userid)
{
Data.User dbuser=new Betaone.Data.User(connectionString);
Data.UserDetails tmpuse=dbuser.GedDetails(userid);
if(tmpuse!=null)
{
id=tmpuse.id;
username=tmpuse.username;
password=tmpuse.password;
division=tmpuse.division;
question=tmpuse.question;
answer=tmpuse.answer; }
}
/// <summary>
/// 添加一个用户
/// </summary>
/// <returns>返回新用户的id</returns>
public int Add()
{
Data.User dbuser=new Betaone.Data.User(connectionString);
id=dbuser.Add(username,password,division,question,answer);
return id; } public bool Delete(string username)
{
Data.User dbuser=new Betaone.Data.User(connectionString);
bool result=dbuser.deleteuserbyname(username);
if(result)
id=-1;
return result;
} /// <summary>
/// 更新用户信息
/// </summary>
/// <returns></returns>
public bool Update()
{
if(id==-1) return false;
Data.User dbuser=new Betaone.Data.User(connectionString);
return dbuser.Update(id,password,division,question,answer);
}

/// <summary>
/// 设置用户密码
/// </summary>
/// <param name="plainpassword"></param>
public void Setpassword(string plainpassword)
{
password=Encrypt(plainpassword);
} /// <summary>
/// 设置提示问题
/// </summary>
/// <param name="plainquestion"></param>
public void SetQuestion(string plainquestion)
{
question=Encrypt(plainquestion);
}
/// <summary>
/// 设置提示问题答案
/// </summary>
/// <param name="plainanswer"></param>
public void SetAnswer(string plainanswer)
{
answer=Encrypt(plainanswer);
} /// <summary>
/// 使用SHA1算法加密指定的字符串
/// </summary>
/// <param name="plainText"></param>
/// <returns></returns>
public byte[] Encrypt(string plainText)
{
UnicodeEncoding encoding=new UnicodeEncoding();
byte[] hashbytes=encoding.GetBytes(plainText); SHA1 sha1=new SHA1CryptoServiceProvider();
return sha1.ComputeHash(hashbytes);
} /// <summary>
/// 比较指定的提示问题与答案是否与加密的提示问题与答案相符
/// </summary>
/// <param name="plainQuestion">提示问题明文</param>
/// <param name="plainAnswer">答案明文</param>
/// <returns>如相同返回true,否则返回false</returns>
public bool CompareQusetionAnswer(string plainQuestion,string plainAnswer)
{
byte[] shaQuestion=Encrypt(plainQuestion);
byte[] shaAnswer=Encrypt(plainAnswer);
for(int i=0;i<question.Length;i++)
{
if (question[i]!=shaQuestion[i])
{
return false;
}
}
for(int i=0;i<answer.Length;i++)
{
if(answer[i]!=shaAnswer[i])
{
return false;
}
}
return true;
} /// <summary>
/// 修改密码
/// </summary>
/// <param name="oldpassword">原密码明文</param>
/// <param name="newpassword">新密码明文</param>
/// <returns>修改成功返回true,否则返回false</returns>
public bool Modifypassword(string oldpassword,string newpassword)
{
byte[] shaoldpass=Encrypt(oldpassword);
byte[] shanewpass=Encrypt(newpassword);
for(int i=0;i<password.Length;i++)
{
if(password[i]!=shaoldpass[i])
{
return false;
}
}
password=shanewpass;
Update();
return true;
} /// <summary>
/// 返回包含用户的所有角色
/// </summary>
/// <returns>角色列表</returns>
public ArrayList GetRoles()
{
if(id==-1) return null;
Data.User dbuser=new Betaone.Data.User(connectionString);
return dbuser.GetRoles(id);
} /// <summary>
/// 返回用户所拥有的权限
/// </summary>
/// <returns>权限列表</returns>
public ArrayList GetPermissions()
{
if(id==-1) return null;
Data.User dbuser=new Betaone.Data.User(connectionString);
return dbuser.GetPermissions(id);
}
/// <summary>
/// 返回符合指定条件的所有用户名
/// </summary>
/// <param name="name"></param>
/// <returns>用户名列表</returns>
public static ArrayList GetLoginName(string name)
{
AppSettingsReader configurationAppSettings=new AppSettingsReader();
string connString=((string)(configurationAppSettings.GetValue("connectionString",typeof(string))));
Data.User dbuser=new Betaone.Data.User(connString);
return dbuser.GetUseruserNames(name+"%");
} }

}代码(验证类)
using System;
using System.Collections;
using System.Security;
using System.Security.Cryptography;
using Betaone.Data;
using Betaone.Business;namespace Betaone.Accounts
{
/// <summary>
/// MyIdentity 的摘要说明。
/// </summary>
public class MyIdentity:System.Security.Principal.IIdentity
{
private Business.User user; public MyIdentity()
{
user=null;
} public MyIdentity(int userid)
{
user=new Betaone.Business.User(userid);
} public MyIdentity(string username)
{
user=new Betaone.Business.User(username);
} #region IIdentity 成员 public bool IsAuthenticated
{
get{return true ;}
} public string Name
{
get
{
return user.username;
}
} public string AuthenticationType
{
get{return "自定义身份验证";}
} #endregion  #region 自定义属性 public byte[] password
{
get{return user.password;}
} public int id
{
get{return user.id;}
}
public Business.User User
{
get{return user;}
set{user=value;}
}
#endregion /// <summary>
/// 测试给出的密码是否正确
/// </summary>
/// <param name="pass">要测试的密码明文</param>
/// <returns>如果正确返回true,反之返回flase</returns>
public bool TestPassword(string pass)
{
byte[] encryptPass=user.Encrypt(pass);
for(int i=0;i<encryptPass.Length;i++)
{
if(encryptPass[i]!=user.password[i])
return false;
}
return true;
}
}
}

解决方案 »

  1.   

    public int id;
    public string username;
    public byte[] password;
    public string division;
    public byte[] question;
    public byte[] answer;改成这种形式
    public Business.User User
    {
    get{return user;}
    set{user=value;}
    }
    你的代码有点长,没仔细看
      

  2.   

    Business类中没有调用验证类的属性和方法,当然也没有传参数给验证类。验证类怎么会有数据呢?
      

  3.   

    楼上的大侠,身份验证的过程是从验证类到Business类的啊!