【ASP.NET MVC】使用动软(四)(12)

这篇具有很好参考价值的文章主要介绍了【ASP.NET MVC】使用动软(四)(12)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、筛选器类和Cookie实现路由

需解决的问题:

网站登录往往需要用户名+密码验证,为避免重复验证,一般采用Cookie 、Session等技术来保持用户的登录状态:

Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式

 从上解释可见,Cookie 比 Session 更简单,也不占用服务器的资源。

ActionFilterAttribute  +  Cookie 可以解决 以上问题:

首先,在工程中新建一个空目录(名称自取):

【ASP.NET MVC】使用动软(四)(12),ASP.NET MVC,asp.net,前端,服务器

然后,在目录中添加一个类 UserCookie  负责对用户登录信息的Cookie相应操作:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
namespace ManageSysetm.Tools
{
    public class UserCookie
    {
        public static T JsonDeserialize<T>(string jsonString)
        {
            return JsonConvert.DeserializeObject<T>(jsonString);
        }

        public static string ToJson(object obj)
        {
            JsonSerializerSettings settings = new JsonSerializerSettings();
            settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            return JsonConvert.SerializeObject(obj);
        }
        public static void WriteCookie(Maticsoft.Model.user mod)
        {            
            FormsAuthentication.SetAuthCookie(ToJson(mod), true, FormsAuthentication.FormsCookiePath);
            //把用户对象保存在票据里                
            FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket(1, mod.userName, DateTime.Now, DateTime.Now.AddTicks(FormsAuthentication.Timeout.Ticks), false, ToJson(mod));
            //加密票据
            string hashTicket = FormsAuthentication.Encrypt(Ticket);
            HttpCookie userCookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashTicket);
            userCookie.Expires.AddHours(3);
            System.Web.HttpContext.Current.Response.Cookies.Add(userCookie);
        }

        public static Maticsoft.Model.user ReadCookie()
        {
            try
            {
                var cookie = System.Web.HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; //的到Cookie
                if (cookie == null)
                    return null;
                var ticket = FormsAuthentication.Decrypt(cookie.Value); //解密票据
                string str = ticket.UserData;
                return JsonDeserialize<Maticsoft.Model.user>(str);
            }
            catch
            {
                return null;
            }
        }

        public static void ReMoveCookie()
        {
            FormsAuthentication.SignOut();
        }
   }
}

 说明:

1、添加了序列化的Json处理函数,关于JSON可以参考前面的介绍;

2、读写Cookie:对输入的Model 序列化 (ToJson) 成字符串,然后写入票据,读的过程正好相反

再添加筛选器类:IsLogin  继承于 ActionFilterAttribute

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace ManageSysetm.Tools
{
    public class IsLogin : ActionFilterAttribute
    {
        //当方法执行时       
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            try
            {              
                var isLogin = UserCookie.ReadCookie();
                if (isLogin == null)
                {
                    filterContext.Result = new RedirectResult("/Home/login");                 
                }
            }
            catch
            {
                filterContext.Result = new RedirectResult("/Home/login");               
            }
            base.OnActionExecuting(filterContext);
        }
        //当方法执行完毕
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);
        }
    }
}

逻辑比较简单:判断是否存在Cookie,不存在的时候或者异常时跳转到登录页面,否则正常通过。

二、使用

可以用“帽子”的方法来实现筛选:

【ASP.NET MVC】使用动软(四)(12),ASP.NET MVC,asp.net,前端,服务器

 在默认的路由 Index上添加 筛选器 IsLogin ,则在该Action执行前先进行筛选器判断:取Cookie,没有则返回登录页面,否则正常进入Index 。

拓展:

既然可以添加 筛选器 IsLogin ,那么是否也可以添加  筛选器 IsAdmin (名称自取) ? ——这样可以根据不同用户角色筛选进入不同的页面。

当然是可以的,解决思路无非就是加入用户Cookie中身份的判断逻辑!

三、补充

数据表中用明文记录用户的密码是不可取的,一旦数据表被曝光后,用户的角色就能够被人使用。比如:数据库管理人员可以利用数据表中的用户名和密码直接进行用户角色登录!

解决方法是加密:(贴几个实用函数,可以放入某个工具类中)

 private static string Key
        {
            get { return @")O[NB]6,YF}+efcaj{+oESb9d8>Z'e9M"; }
        }
        private static string IV
        {
            get { return @"L+\~f4,Ir)b$=pkf"; }
        }
        public static string Encrypt(string pwd)//加密
        {

            byte[] bKey = Encoding.UTF8.GetBytes(Key);
            byte[] bIV = Encoding.UTF8.GetBytes(IV);
            byte[] byteArray = Encoding.UTF8.GetBytes(pwd);//将字符串转换为字节序列

            string encrypt = null;
            Rijndael aes = Rijndael.Create();
            using (MemoryStream mStream = new MemoryStream())//创建内存流对象
            {
                using (CryptoStream cStream = new CryptoStream(mStream, aes.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write))//创建加密流对象
                {
                    cStream.Write(byteArray, 0, byteArray.Length);//向加密流中写入字节序列
                    cStream.FlushFinalBlock();//将数据压入基础流,用缓冲区的当前状态更新基础数据源或储存库,随后清除缓冲区。
                    encrypt = Convert.ToBase64String(mStream.ToArray());//从内存流中获取字节序列,并返回加密后的字符串
                }
            }
            aes.Clear();
            return encrypt;

        }
       
        public static string AESDecrypt(string encryptStr)
        {
            byte[] bKey = Encoding.UTF8.GetBytes(Key);
            byte[] bIV = Encoding.UTF8.GetBytes(IV);
            byte[] byteArray = Convert.FromBase64String(encryptStr);

            string decrypt = null;
            Rijndael aes = Rijndael.Create();
            using (MemoryStream mStream = new MemoryStream())
            {
                using (CryptoStream cStream = new CryptoStream(mStream, aes.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write))
                {
                    cStream.Write(byteArray, 0, byteArray.Length);
                    cStream.FlushFinalBlock();
                    decrypt = Encoding.UTF8.GetString(mStream.ToArray());
                }
            }
            aes.Clear();
            return decrypt;
        }

使用方法比较简单:string s= UserCookie.Encrypt(password);  //对密码加密处理

加密字符串,由此解决用户表密码信息的保护:

【ASP.NET MVC】使用动软(四)(12),ASP.NET MVC,asp.net,前端,服务器

 PS:

验证的时候不需要解密,用户输入的密码加密 与 数据表中字段匹配一下即可。文章来源地址https://www.toymoban.com/news/detail-627705.html

到了这里,关于【ASP.NET MVC】使用动软(四)(12)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Asp.Net MVC 使用Log4Net

    在 ASP.NET MVC 中使用 Log4net 需要进行一些配置和代码集成。下面是在 ASP.NET MVC 中使用 Log4net 的步骤: 打开 NuGet 包管理器控制台,并运行以下命令来安装 Log4net: 在你的 ASP.NET MVC 项目中,创建一个名为 log4net.config 的文件(或者其他名称,只要后缀是 .config 即可),用于配置

    2024年02月15日
    浏览(10)
  • ASP.NET Core MVC 使用 JWT 的示例

    创建一个 ASP.NET Core MVC 项目。 添加 NuGet 包: Microsoft.AspNetCore.Authentication.JwtBearer:用于支持 JWT 的身份验证。 System.IdentityModel.Tokens.Jwt:用于生成和验证 JWT。 在 Startup.cs 文件中做如下修改: 请注意,在上述代码中,您需要将以下参数替换为实际的值: \\\"your_issuer\\\" :发行者的标

    2024年02月13日
    浏览(14)
  • ASP.NET Core MVC -- 将视图添加到 ASP.NET Core MVC 应用

    ASP.NET Core MVC -- 将视图添加到 ASP.NET Core MVC 应用

    右键单击“视图”文件夹,然后单击“添加”“新文件夹”,并将文件夹命名为“HelloWorld”。 右键单击“Views/HelloWorld”文件夹,然后单击“添加”“新项”。 在“添加新项 - MvcMovie”对话框中: 在右上角的搜索框中,输入“视图” 选择“Razor 视图 - 空” 保持“名称”框的

    2024年02月13日
    浏览(66)
  • DevExpress DXperience Crack Blazor, ASP.NET, ASP.NET MVC

    DevExpress DXperience Crack Blazor, ASP.NET, ASP.NET MVC

    DevExpress DXperience helps you build applications for Windows, Web, mobile and tablet with all of the DevExpress single platform controls and more. The DevExpress DXperience Subscription includes hundreds of Desktop UI Controls (WinForms, WPF and Desktop Reporting), Web UI Controls (Blazor, ASP.NET, ASP.NET MVC and Core, Bootstrap Web Forms, JavaScript - jQ

    2024年04月11日
    浏览(10)
  • 界面组件Telerik ASP.NET MVC使用指南 - 如何自定义网格过滤

    界面组件Telerik ASP.NET MVC使用指南 - 如何自定义网格过滤

    Telerik UI for ASP. NET MVC拥有使用JavaScript和HTML5构建网站和移动应用所需的70+UI部件,来满足开发者的各种需求,提供无语伦比的开发性能和用户体验。它主要是针对专业级的 ASP.NET开发,通过该产品的强大功能,开发者可以开发出功能丰富、适应标准广泛的响应式应用程序。 在

    2023年04月13日
    浏览(7)
  • 【ASP.NET】手把手创建一个ASP.NET项目以及MVC模式的介绍

    【ASP.NET】手把手创建一个ASP.NET项目以及MVC模式的介绍

    🌳 作者:@哈桑c(CSDN平台) 🌲 专栏:C#/.NET系列文章 序号 系列文章 - 【.NET】.NET 框架概述 - .NET环境和开发工具Visual Studio的安装 本文演示如何在 Visual Studio 工具上创建一个 ASP.NET 项目以及 MVC 模式下的项目文件的介绍。相信大家看完之后就会对 ASP.NET 框架有一个初步的认识

    2024年02月06日
    浏览(13)
  • ASP.NET MVC - 安全

    ASP.NET MVC - 安全

    为了学习 ASP.NET MVC,我们将构建一个 Internet 应用程序。 第 8 部分:添加安全。 Models 文件夹 包含表示应用程序模型的类。 Visual Web Developer 自动创建  AccountModels.cs  文件,该文件包含用于应用程序认证的模型。 AccountModels  包含  LogOnModel 、 ChangePasswordModel  和  RegisterModel :

    2024年02月21日
    浏览(12)
  • 在ASP.NET MVC中使用JQuery提供的弹出窗口(模态窗口)

    使用 div 图层灵活显示在浏览器的任何位置。默认情况下指定 div 不可见 样式表 在JQuery的官方网站可以下载对应的css样式表。打开官网的样例页。 找到样式表引用路径 将其下载到本机,其中thme 比如,我的样式表路径为 JQuery库 下载JQuery和JQuery-ui库,并放置在对应的路径中

    2024年01月15日
    浏览(14)
  • ASP.NET Core MVC -- 入门

    ASP.NET Core MVC -- 入门

     带有 ASP.NET 和 Web 开发工作负载的Visual Studio Visual Studio Code Visual Studio Code 用于 Visual Studio Code 的 C#(最新版本) .NET 7.0 SDK  ctrl + F5 (开始执行,不调试) 在代码工作区间文件夹路径下打开终端运行下面的命令  通过运行以下命令来信任 HTTPS 开发证书: 编译运行

    2024年02月11日
    浏览(25)
  • 【ASP.NET MVC】生成页面(6)

    【ASP.NET MVC】生成页面(6)

    本应该继续数据库访问的问题进行探讨,前文确实比较LOW。但本人认为:初学者需要解决的是快速了解知识路线的问题,所谓“生存问题”,所以,干脆把流程先走完。 下面这张图在前面已经介绍过:  前文其实已经 “初步” 解决了数据库读写操作了(可理解为 C 到 M 的双

    2024年02月14日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包