在现代移动应用开发中,用户身份验证是一个核心功能。本文将探讨如何在移动设备上实现ASP.NET角色和会员身份验证系统。这涉及到将移动设备与后端数据库同步,以便用户可以使用他们现有的ASP.NET角色和会员身份凭据在移动设备上验证他们的账户。
为了实现这一功能,首先需要确保移动设备能够与后端数据库进行通信,并下载所有相关的用户数据。这通常涉及到将ASP.NET的aspnet_XXXX
表同步到移动设备上。
接下来,将展示如何在C#中编写代码来检查用户名是否匹配,然后比较用户最初生成的密码哈希与用户提供的密码生成的哈希。
在程序的最后,将持久化用户数据,以便程序的其他部分可以使用这些数据。
以下是实现用户登录的C#代码示例:
public bool LogonUser(string userName, string passWord)
{
Guid userID = Guid.Empty;
string originalHash = "";
string saltValue = "";
DataLayer dataLayer = new DataLayer();
// 首先检查用户名
try
{
string SQL = "Select aspnet_Membership.UserId, Password, PasswordSalt " +
"From aspnet_Membership inner join aspnet_Users on aspnet_Membership.UserID = aspnet_Users.UserID " +
"Where LoweredUserName = @p1 ";
SqlCeCommand sqlCeCommand = new SqlCeCommand(SQL, dataLayer.GetOpenConnection);
SqlCeParameter param1 = sqlCeCommand.Parameters.Add("p1", System.Data.SqlDbType.NVarChar);
param1.Value = userName.ToLower();
SqlCeDataReader reader = sqlCeCommand.ExecuteReader();
while (reader.Read())
{
userID = reader.GetGuid(0);
originalHash = reader.GetString(1);
saltValue = reader.GetString(2);
break;
}
reader.Close();
}
catch (Exception ex)
{
new Logger().Log(ex);
throw ex;
}
finally
{
dataLayer.CloseSQLConnection();
}
// 用户名存在
if (userID.CompareTo(Guid.Empty) != 0)
{
// 比较密码哈希
byte[] bIn = Encoding.Unicode.GetBytes(passWord);
byte[] bSalt = Convert.FromBase64String(saltValue);
byte[] bAll = new byte[bSalt.Length + bIn.Length];
byte[] bRet = null;
Buffer.BlockCopy(bSalt, 0, bAll, 0, bSalt.Length);
Buffer.BlockCopy(bIn, 0, bAll, bSalt.Length, bIn.Length);
HashAlgorithm s = HashAlgorithm.Create("SHA1");
bRet = s.ComputeHash(bAll);
string newHash = Convert.ToBase64String(bRet);
// 检查数据库中的哈希是否与生成的新哈希匹配
if (originalHash != newHash)
{
throw new Exception("Incorrect Username/Password combination. Please try again");
}
}
else
{
throw new Exception("Incorrect Username/Password combination. Please try again");
}
// 将用户的凭据存储在配置对象中,以便应用程序实例使用
Config.UserID = userID;
Config.UserName = userName;
Config.PassWord = passWord;
return true;
}
这段代码首先通过执行一个SQL查询来检查用户名是否存在。如果用户名存在,它将获取用户的密码哈希和盐值。然后,它将用户输入的密码与存储的哈希进行比较。如果哈希匹配,它将用户的凭据存储在配置对象中,以便程序的其他部分可以使用这些数据。