本文将详细讲解如何利用 Asp.NET 实现多层登陆,以下是完整的实现攻略:
第一步:创建用户数据库
在创建用户数据库之前,必须先安装 Microsoft SQL Server 数据库并创建一个新的数据库。可以按照以下步骤创建一个新的用户数据库:
- 打开 Microsoft SQL Server 的管理工具(如SqlServer Management Studio或Visual Studio)并登录
- 在 "Object Explorer" 窗口中,右键单击 "Databases" 文件夹,并选择 "New Database"
- 在 "New Database" 对话框中,输入一个数据库名称,例如 "Users",并点击 "OK" 按钮
- 在左侧导航栏中,展开新创建的 "Users" 数据库,右键单击 "Tables" 文件夹,并选择 "New Table"
- 添加一个 "Users" 表格,包括以下字段:
- Id:int类型,自增主键
- UserName:nvarchar(50),用于存放用户名
- Password:nvarchar(50),用于存放加密后的密码
- Role:nvarchar(50),用于存放用户角色
- 保存并关闭 "New Table" 对话框
- 在 "Users" 表格中,添加至少一个用户,用于后续测试验证登陆功能
第二步:创建 Asp.NET 应用程序
- 打开 Visual Studio,建立一个新的 Asp.NET 项目。选择类型为 "Web Application",并选择 "Empty" 模板
- 将项目命名为 "AspNetMultyLayerLogin"
- 在解决方案资源管理器中,右键单击 "AspNetMultyLayerLogin" 项目,并选择 "Add" -> "New Folder"
- 将新创建的文件夹命名为 "Models"
- 在 "Models" 文件夹中,创建一个名为 "User" 的新类,并定义以下属性:
public class User
{
public int Id { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string Role { get; set; }
}
- 在 "Models" 文件夹中,创建一个名为 "UserDataAccessLayer" 的新类,并定义以下方法:
public class UserDataAccessLayer
{
private static string connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
public static User GetUser(string userName, string password)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand("SELECT * FROM Users WHERE UserName = @UserName AND Password = @Password", connection);
command.Parameters.AddWithValue("@UserName", userName);
command.Parameters.AddWithValue("@Password", password);
SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows)
{
User user = new User();
while (reader.Read())
{
user.Id = int.Parse(reader["Id"].ToString());
user.UserName = reader["UserName"].ToString();
user.Password = reader["Password"].ToString();
user.Role = reader["Role"].ToString();
}
return user;
}
else
{
return null;
}
}
}
}
- 在 "Models" 文件夹中,创建一个名为 "RoleProvider" 的新类,并定义以下方法:
public class RoleProvider
{
public static bool IsUserInRole(string userName, string role)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = new SqlCommand("SELECT Role FROM Users WHERE UserName = @UserName", connection);
command.Parameters.AddWithValue("@UserName", userName);
SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
string userRole = reader["Role"].ToString();
if (userRole.Equals(role, StringComparison.OrdinalIgnoreCase))
{
return true;
}
}
}
return false;
}
}
}
- 在 "Models" 文件夹中,创建一个名为 "Utils" 的新类,并定义以下方法:
public class Utils
{
private static Random random = new Random();
public static string GenerateSalt(int length)
{
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
return new string(Enumerable.Repeat(chars, length).Select(s => s[random.Next(s.Length)]).ToArray());
}
public static string ComputeHash(string plainText, string salt)
{
byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
byte[] saltBytes = Encoding.UTF8.GetBytes(salt);
byte[] plainTextWithSaltBytes = new byte[plainTextBytes.Length + saltBytes.Length];
for (int i = 0; i < plainTextBytes.Length; i++)
{
plainTextWithSaltBytes[i] = plainTextBytes[i];
}
for (int i = 0; i < saltBytes.Length; i++)
{
plainTextWithSaltBytes[plainTextBytes.Length + i] = saltBytes[i];
}
HashAlgorithm algorithm = new SHA256Managed();
byte[] hash = algorithm.ComputeHash(plainTextWithSaltBytes);
return Convert.ToBase64String(hash);
}
}
- 在 "Models" 文件夹中,创建一个名为 "LoginViewModel" 的新类,并定义以下属性:
public class LoginViewModel
{
public string UserName { get; set; }
public string Password { get; set; }
public string Role { get; set; }
public bool RememberMe { get; set; }
}
- 在 "Models" 文件夹中,创建一个名为 "AccountController" 的新控制器,并使用以下代码替换默认的代码:
public class AccountController : Controller
{
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
string salt = Utils.GenerateSalt(16);
string hashedPassword = Utils.ComputeHash(model.Password, salt);
User user = UserDataAccessLayer.GetUser(model.UserName, hashedPassword);
if (user != null)
{
FormsAuthentication.SetAuthCookie(user.UserName, model.RememberMe);
if (RoleProvider.IsUserInRole(user.UserName, model.Role))
{
return RedirectToLocal(returnUrl);
}
else
{
ModelState.AddModelError("", "You are not authorized to access this page");
}
}
else
{
ModelState.AddModelError("", "Invalid username or password");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
FormsAuthentication.SignOut();
return RedirectToAction("Index", "Home");
}
private ActionResult RedirectToLocal(string returnUrl)
{
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
}
- 在解决方案资源管理器中,右键单击 "AspNetMultyLayerLogin" 项目,并选择 "Add" -> "New Folder"
- 将新创建的文件夹命名为 "Views"
- 在 "Views" 文件夹中,创建一个名为 "Account" 的新文件夹
- 在 "Account" 文件夹中,创建一个名为 "Login.cshtml" 的新视图,并使用以下代码替换默认的代码:
@model AspNetMultyLayerLogin.Models.LoginViewModel
@{
ViewBag.Title = "Log in";
}
<h2>@ViewBag.Title</h2>
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))
{
@Html.AntiForgeryToken()
<div class="form-group">
@Html.LabelFor(m => m.UserName, new { @class = "control-label" })
@Html.TextBoxFor(m => m.UserName, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.UserName)
</div>
<div class="form-group">
@Html.LabelFor(m => m.Password, new { @class = "control-label" })
@Html.PasswordFor(m => m.Password, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Password)
</div>
<div class="form-group">
@Html.LabelFor(m => m.Role, new { @class = "control-label" })
@Html.DropDownListFor(m => m.Role, new SelectList(new List<string> { "Admin", "User" }), "-- Select Role --", new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Role)
</div>
<div class="form-group">
@Html.CheckBoxFor(m => m.RememberMe)
@Html.LabelFor(m => m.RememberMe, new { @class = "control-label" })
</div>
<div class="form-group">
<input type="submit" value="Log in" class="btn btn-primary" />
</div>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
第三步:测试并部署应用程序
- 运行应用程序并转到登录页面
- 输入先前在用户数据库中创建的用户来进行登录
- 以不同的角色尝试登录,应该会被授权或拒绝访问所请求的资源。
以上就是完整的 Asp.NET 多层登陆实现攻略。通过此方法,可以轻松实现多层登陆,并对不同用户进行授权或拒绝访问不同的页面。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Asp.NET 多层登陆实现代码 - Python技术站