Asp.NET 多层登陆实现代码

本文将详细讲解如何利用 Asp.NET 实现多层登陆,以下是完整的实现攻略:

第一步:创建用户数据库

在创建用户数据库之前,必须先安装 Microsoft SQL Server 数据库并创建一个新的数据库。可以按照以下步骤创建一个新的用户数据库:

  1. 打开 Microsoft SQL Server 的管理工具(如SqlServer Management Studio或Visual Studio)并登录
  2. 在 "Object Explorer" 窗口中,右键单击 "Databases" 文件夹,并选择 "New Database"
  3. 在 "New Database" 对话框中,输入一个数据库名称,例如 "Users",并点击 "OK" 按钮
  4. 在左侧导航栏中,展开新创建的 "Users" 数据库,右键单击 "Tables" 文件夹,并选择 "New Table"
  5. 添加一个 "Users" 表格,包括以下字段:
  6. Id:int类型,自增主键
  7. UserName:nvarchar(50),用于存放用户名
  8. Password:nvarchar(50),用于存放加密后的密码
  9. Role:nvarchar(50),用于存放用户角色
  10. 保存并关闭 "New Table" 对话框
  11. 在 "Users" 表格中,添加至少一个用户,用于后续测试验证登陆功能

第二步:创建 Asp.NET 应用程序

  1. 打开 Visual Studio,建立一个新的 Asp.NET 项目。选择类型为 "Web Application",并选择 "Empty" 模板
  2. 将项目命名为 "AspNetMultyLayerLogin"
  3. 在解决方案资源管理器中,右键单击 "AspNetMultyLayerLogin" 项目,并选择 "Add" -> "New Folder"
  4. 将新创建的文件夹命名为 "Models"
  5. 在 "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; }
}
  1. 在 "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;
            }
        }
    }
}
  1. 在 "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;
        }
    }
}
  1. 在 "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);
    }
}
  1. 在 "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; }
}
  1. 在 "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");
        }
    }
}
  1. 在解决方案资源管理器中,右键单击 "AspNetMultyLayerLogin" 项目,并选择 "Add" -> "New Folder"
  2. 将新创建的文件夹命名为 "Views"
  3. 在 "Views" 文件夹中,创建一个名为 "Account" 的新文件夹
  4. 在 "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")
}

第三步:测试并部署应用程序

  1. 运行应用程序并转到登录页面
  2. 输入先前在用户数据库中创建的用户来进行登录
  3. 以不同的角色尝试登录,应该会被授权或拒绝访问所请求的资源。

以上就是完整的 Asp.NET 多层登陆实现攻略。通过此方法,可以轻松实现多层登陆,并对不同用户进行授权或拒绝访问不同的页面。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Asp.NET 多层登陆实现代码 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C#中实现PriorityQueue优先级队列的代码

    实现PriorityQueue(优先级队列)在C#中是很常见的需求,下面我将为大家介绍如何使用C#编写PriorityQueue。 什么是PriorityQueue? PriorityQueue,即优先队列,是一种按照元素优先级进行排序的队列,具有以下特点: 在队列中插入元素时,会按照一定的优先级排序; 在队列中弹出元素时,会弹出队列中优先级最高的元素; 可…

    C# 2023年6月7日
    00
  • Jquery+asp.net后台数据传到前台js进行解析的方法

    在ASP.NET中,可以使用JQuery将后台数据传递到前台JavaScript进行解析。本文将提供详解如何使用JQuery+ASP.NET后台数据传到前台JavaScript进行解析的完整攻略,包括在ASP.NET中使用JQuery、在后台代码中获取数据、在前台JavaScript中解析数据等。同时,本文还提供两个示例,演示如何使用JQuery+ASP.N…

    C# 2023年5月15日
    00
  • C#实现判断当前操作用户管理角色的方法

    下面是“C#实现判断当前操作用户管理角色的方法”的完整攻略: 1. 获取当前用户信息 在进行角色判断之前,需要先获取当前操作的用户信息,包括用户的编号、姓名、角色、权限等等。可以通过以下代码获取: // 获取当前登录用户信息 var user = User.Identity.GetUserIdentity(); 2. 获取当前用户的角色 得到当前用户的信息后…

    C# 2023年5月15日
    00
  • ASP.NET Core获取正确查询字符串参数示例

    标题:ASP.NET Core获取正确查询字符串参数示例 前言: 在Web应用程序中,查询字符串是一种常用的传递参数的方式。然而在ASP.NET Core中,获取查询字符串时需要特别注意一些情况,否则就可能出现获取不到参数值或者获取到错误参数值的问题。本文将详细讲解ASP.NET Core获取正确查询字符串参数的示例。 一、在Controller中获取查询字…

    C# 2023年6月3日
    00
  • C#自定义函数NetxtString生成随机字符串

    下面就为大家讲解一下如何在C#中自定义函数NetxtString生成随机字符串。 1、概述 NetxtString是一个C#字符串扩展类,提供了生成随机字符串的方法,可以指定生成字符串的长度和字符集。下面是该类的源码: public static class NetxtString { private static Random random = new R…

    C# 2023年5月31日
    00
  • C#中LINQ to DataSet操作及DataTable与LINQ相互转换

    C#中LINQ to DataSet操作及DataTable与LINQ相互转换 简介 LINQ to DataSet是指使用LINQ技术访问和操作DataSet对象的数据。使用LINQ to DataSet可以将DataSet中的数据以一个强类型的方式表示出来,并且可以直接使用LINQ语言进行过滤、匹配和排序。 同时,DataTable与LINQ之间也可以进…

    C# 2023年6月1日
    00
  • 使用C#在注册表中保存信息的例子

    在C#中,可以使用Microsoft.Win32命名空间中的Registry类来访问系统注册表。下面是使用C#在注册表中保存信息的攻略。 1. 创建注册表项 在注册表中保存信息之前,需要先创建一个注册表项。可以使用RegistryKey类的CreateSubKey方法来创建一个新的子项。以下示例代码创建名为“myapp”的注册表项: using Micros…

    C# 2023年6月7日
    00
  • .NET中的属性用法分析

    .NET中的属性用法分析 属性是.NET框架中的一个关键特性,它提供了一种在运行时为对象附加元数据以及在对象上设置特定行为的机制。本文将深入介绍属性的用法分析。 属性的定义 属性定义与函数定义的核心区别在于,属性指定了用于获取或设置值的特定方法。 如下是一个示例: public class Person { private string name; publ…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部