ASP.NET MVC 如何使用 Form Authentication?

news2024/11/28 14:40:31

image

前言

.NET 的 Form Authentication 是一种基于表单的简单且灵活的身份验证机制,用户通过输入用户名和密码来登录应用程序,并且通过配置来控制用户访问权限。

在使用 Form Authentication 时,我们需要在 web.config 文件中配置身份验证和授权规则,以及指定登录页面和登出页面等设置。

当用户访问需要身份验证的页面时,系统会自动重定向到登录页面,用户输入正确的用户名和密码后,系统在验证用户身份后生成一个身份验证票据,在后续的操作中,使用这个票据来确定用户的身份。

Form Authentication 是 ASP.NET 中内置的身份验证机制,使用起来相对简单,不需要额外的库或工具。

总的来说,相比 JWT 身份验证,Form Authentication 具有简单易用、自定义性强等优点,但同时也存在 CSRF(跨站请求伪造)等安全风险,适合用在简单的 Web 应用中。

下面讲一讲如何在 ASP.NET MVC 项目中使用 Form Authentication?

Step By Step 步骤

  1. 创建一个 ASP.NET MVC 项目

  2. 打开 Web.config,配置使用 Form Authentication

    <configuration>
    	<system.web>
    		<authentication mode="Forms">
    		  <forms name=".login" loginUrl="login" timeout="30" slidingExpiration="true" />
    		</authentication>
    		......
    	</system.web>
    	......
    </configuration>
    
  3. 增加一个Attribute类,继承自 AuthorizeAttribute,留意注释

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace Ando.ERP.Client.Mvc.Attribute
    {
    	/// <summary>
    	/// 自定义身份验证特性
    	/// </summary>
    	public class CustomAuthorzieAttribute: AuthorizeAttribute
    	{
    		private string _controllerName = string.Empty;
    		private string _actionName = string.Empty;
    
    		/// <summary>
    		/// 重写基类的 OnAuthorization 方法 
    		/// 
    		/// OnAuthorization 是该类的总入口
    		/// </summary>
    		/// <param name="filterContext"></param>
    		public override void OnAuthorization(AuthorizationContext filterContext)
    		{
    			_controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
    			_actionName = filterContext.ActionDescriptor.ActionName;
    
    			base.OnAuthorization(filterContext);
    		}
    
    		/// <summary>
    		/// 重写基类的 AuthorizeCore 方法
    		/// OnAuthorization 会首先调用此方法进行处理
    		/// </summary>
    		/// <param name="httpContext"></param>
    		/// <returns></returns>
    		protected override bool AuthorizeCore(HttpContextBase httpContext)
    		{
    			//Login UI,Don't need authentication and return true
    			if (_controllerName.ToLower() == "login")
    			{
    				return true;
    			}
    
    			if (httpContext.Session["UserInfo"] == null || httpContext.User == null || !httpContext.User.Identity.IsAuthenticated)
    			{
    				return false;
    			}
    
    			return true;
    		}
    
    		/// <summary>
    		/// 重写基类的 HandleUnauthorizedRequest 方法
    		/// 当 AuthorizeCore 方法返回 false,OnAuthorization 会继续调用此方法进行处理
    		/// </summary>
    		/// <param name="filterContext"></param>
    		protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    		{
    			base.HandleUnauthorizedRequest(filterContext);
    		}
    	}
    }	
    
  4. 在 App_Start/FilterConfig.cs 中注册自定义的 CustomAuthorzieAttribute

    using Ando.ERP.Client.Mvc.Attribute;
    using System.Web;
    using System.Web.Mvc;
    
    namespace Ando.ERP.Client.Mvc
    {
    	public class FilterConfig
    	{
    		public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    		{
    			filters.Add(new HandleErrorAttribute());
    			filters.Add(new CustomAuthorzieAttribute());
    		}
    	}
    }
    
  5. 新建登录控制器文件写登录方法如 LoginController.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Security;
    using Ando.ERP.Logger;
    using Ando.ERP.BLL;
    using Ando.ERP.BLL.Model;
    
    namespace Ando.ERP.Client.Mvc.Controllers
    {
    	/// <summary>
    	/// 登录模块
    	/// </summary>
    	public class LoginController : Controller
    	{
    		/// <summary>
    		/// Login UI
    		/// </summary>
    		/// <returns></returns>
    		public ActionResult Index()
    		{
    			// Go to Home page if has logged in
    			if (this.Session["UserInfo"] != null && this.User != null && this.User.Identity.IsAuthenticated)
    			{
    				return RedirectToAction("Index", "MainMenu"); 
    			}
    
    			// Else display Login page
    			return View();
    		}
    
    		/// <summary>
    		/// 登录 API
    		/// </summary>
    		/// <param name="userName"></param>
    		/// <param name="password"></param>
    		/// <returns></returns>
    		[HttpPost]
    		public ActionResult Login(string userName, string password)
    		{
    			string status, msg, reurl;
    			var userAuthentication = new BLL.UserAuth.UserAuthentication();
    			var userAuthResult = userAuthentication.Login(userName, password);
    			if (userAuthResult.LoginStatus)
    			{
    				FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddMinutes(30), true, "Valid User", "/");
    				string HashTicket = FormsAuthentication.Encrypt(Ticket);
    				HttpCookie UserCookie = new HttpCookie(FormsAuthentication.FormsCookieName, HashTicket);
    				HttpContext.Response.Cookies.Add(UserCookie);
    				HttpContext.Session["UserInfo"] = userAuthResult;
    
    				status = "1";
    				msg = "sucessful!";
    				reurl = "";
    			}
    			else
    			{
    				status = "0";
    				msg = "登录失败!";
    				reurl = "";
    			}
    
    			return Json(new { status = status, msg = msg, data = userAuthResult, reurl = reurl });
    		}
    	}
    }	
    
  6. 在前端即可以通过 Ajax 之类的技术调用这个 API 进行登录,或者通过 Postman 进行测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1659192.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【资源分享】最新版PS2024免费和谐安装教程

“时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;——时问桫椤 非…

Jmeter(三十三) - 从入门到精通 - Jmeter Http协议录制脚本工具-Badboy6(详解教程)

宏哥微信粉丝群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 今天分享的就是在上一篇文章的基础上来进行讲解和分享&#xff1a;Badboy使用数据源Excel进行脚本参数化。然后在使用读取的参数进行对比断言。 2.具体场景 Badboy录制一个搜索…

高端建站和普通建站有哪些不同

高端建站与普通建站之间存在着显著的差异&#xff0c;从设计到功能、用户体验以及服务质量等各个方面都有所区别。以下是高端建站和普通建站的不同之处&#xff1a; ### 1. 设计质量 - **高端建站**&#xff1a;注重精美、独特的设计风格&#xff0c;通常由专业设计师团队负责。…

深入了解二叉搜索树:原理、操作与应用

文章目录 二叉搜索树二叉搜索树的操作1.查找操作2.插入操作3.查找最大值或者最小值4.删除操作5.前序中序后序遍历 总结 二叉搜索树 形如上图的二叉树就是二叉搜索树&#xff0c;接下来我们来具体阐述一下什么是二叉搜索树。 二叉搜索树的概念&#xff1a;满足左子树的值小于根…

NVIDIA 配置 Jetson 扩展针座

系列文章目录 前言 每个 Jetson 开发套件包括多个扩展接头和连接器&#xff08;统称 "接头"&#xff09;&#xff1a; 40 针扩展接头&#xff1a; 可让您将 Jetson 开发套件连接到现成的 Raspberry Pi HAT&#xff08;顶部附加硬件&#xff09;&#xff0c;如 Seee…

智慧公厕:打造智能、安全、舒适的公共厕所新时代

随着智慧城市建设的不断推进&#xff0c;公共设施的智能化也已成为一种必然趋势。在这一背景下&#xff0c;智慧公厕作为城市管理的一个重要方面&#xff0c;正逐渐走进人们的视野。通过对所在辖区内所有公共厕所的全域感知、全网协同、全业务融合以及全场景智慧的赋能&#xf…

保姆级Lora炼丹教程,让你实现真人模特定制

最近发现很多朋友学会了Stable Diffusion后&#xff0c;都是停留在“玩”的层面。但我觉得让大家“用”起来&#xff0c;才是关键 于是我思考了很久&#xff0c;找出了SD在“应用”层面&#xff0c;最重要的两个功能&#xff1a;Lora和ControlNet Lora负责把自己生活中有关联的…

一篇教你学会HTML:常用标签 | 表格 | 表单 | 特殊符号转义

标题标签 <h1></h1>....<h6></h6> <h1>一级标题</h1><h2>二级标题</h2><h3>三级标题</h3>我们可以添加 align属性 来改变标签的位置 (左对齐&#xff0c;居中&#xff0c;右对齐)&#xff0c;还可以设置颜色等。 …

InfiniGate自研网关实现四

13.服务发现组件搭建和注册网关连接 以封装 api-gateway-core 为目的&#xff0c;搭建 SpringBoot Starter 组件&#xff0c;用于服务注册发现的相关内容处理。 这里最大的目的在于搭建起用于封装网关算力服务的 api-gateway-core 系统&#xff0c;提供网关服务注册发现能力。…

什么是包装ERP软件

在当今的商业环境中&#xff0c;ERP软件已经成为了企业管理的关键工具。然而&#xff0c;许多企业主可能还不完全明白什么是ERP软件&#xff0c;特别是包装ERP软件。 首先&#xff0c;我们需要了解ERP软件的基本概念。它是一种集成的软件应用程序&#xff0c;旨在帮助企业管理…

HTML+VUE3组合式+ELEMENT的容器模板示例(含侧栏导航,表格,...)

一个简单的在html中使用Vue3及Element-plus vue-icons的整合示例&#xff1a; 一、示例截图 二、文件代码 直接复制到html文件在浏览器打开即可预览 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title&g…

智慧仓储可视化大屏,以最直观的形式展示海量数据。

智慧仓储可视化大屏是一种通过数据可视化技术&#xff0c;将仓储管理系统中的海量数据以图表、地图、仪表盘等形式直观展示在大屏上的解决方案。它可以帮助仓储管理人员更清晰地了解仓库的运营情况&#xff0c;从而做出更明智的决策。 智慧仓储可视化大屏通常包括以下功能和特点…

React 第二十六章 Hook useCallback

useCallback 是 React 提供的一个 Hook 函数&#xff0c;用于优化性能。它的作用是返回一个记忆化的函数&#xff0c;当依赖发生变化时&#xff0c;才会重新创建并返回新的函数。 在 React 中&#xff0c;当一个组件重新渲染时&#xff0c;所有的函数都会被重新创建。这可能会…

如何通过汽车制造供应商协同平台,提高供应链的效率与稳定性?

汽车制造供应商协同是指在汽车制造过程中&#xff0c;整车制造商与其零部件供应商之间建立的一种紧密合作的关系。这种协同关系旨在优化整个供应链的效率&#xff0c;降低成本&#xff0c;提高产品质量&#xff0c;加快创新速度&#xff0c;并最终提升整个汽车产业的竞争力。以…

vue2基础语法01——基础语法使用了解

vue2基础语法01——基础语法使用了解 1. vue模板语法1.1 插值语法1.2 指令语法1.3 简单测试完整代码 2. vue中各选项使用&#xff08;简单说几个&#xff09;2.1 el选项2.2 data选项2.2.1 简述2.2.2 data选项的两种类型2.2.3 注意&#xff08;限制&#xff09;2.2.4 更多了解参…

JAVA快速工具代码集

一、前言 在开发过程中&#xff0c;特别是维护老系统&#xff0c;有时候想使用的工具类却使用不了。又要重新造轮子。所以准备点工具类代码是必须的&#xff0c;无奈之举。 二、JSON数据转换 String content cdfQhOrderResModel.getContent(); List<CdfQH…

Python 数据库操作- sqlite3 模块

Python sqlite3 模块 1. 安装 SQLite3 可使用 sqlite3 模块与 Python 进行集成。sqlite3 模块是由 Gerhard Haring 编写的。它提供了一个与 PEP 249 描述的 DB-API 2.0 规范兼容的 SQL 接口。用户不需要单独安装该模块&#xff0c;因为 Python 2.5.x 以上版本默认自带了该模块…

在uniapp里面使用 mp-html 并且开启 latex 功能

在uniapp里面使用 mp-html 并且开启 latex 功能 默认情况下 mp-html 是不会开启 latex 功能的, 如果需要开启 latex 功能是需要到代码操作拉取代码自行打包的。 这里说一下 mp-html 里面的 latex 功能是由 https://github.com/rojer95/katex-mini 提供的技术实现&#xff0c;…

【Spark】Spark编程体验,RDD转换算子、执行算子操作(六)

Spark编程体验 项目依赖管理 <dependencies><dependency><groupId>org.scala-lang</groupId><artifactId>scala-library</artifactId><version>2.12.10</version></dependency><dependency><groupId>org.ap…

通过 Java 操作 redis -- zset 有序集合基本命令

目录 使用命令 zadd&#xff0c;zrange 使用命令 zcard 使用命令 zrem 使用命令 zscore 使用命令 zrank 关于 redis zset 有序集合类型的相关命令推荐看Redis - Zset 有序集合 要想通过 Java 操作 redis&#xff0c;首先要连接上 redis 服务器&#xff0c;推荐看通过 Jav…