当前位置: 首页 > news >正文

ASP.NET Core 6.0 传统鉴权配置

鉴权授权

授权背景介绍

为了保护我们的服务器资源,给被访问的资源或接口添加限制,让每一个请求不能随意访问 服务或 API 或 Action 方法。一般的过程是用户在客户端登录确认身份,向服务器发送登录信息从而验证这个人是否有登录权限。

在ASP.NET中,授权(Authorization)是确定当前用户是否被允许访问特定资源的过程。授权通常在身份验证之后发生,确保用户具有执行某些操作的权限。

Http协议无状态

HTTP请求被设计为无状态协议,意味着每个请求都是独立的,服务器不会在两个请求之间保留任何上下文信息。这是为了简化服务器的设计和提高可伸缩性。然而,有几种方法可以在不同的HTTP请求之间共享信息:

  • 使用Cookies:服务器可以在HTTP响应中设置Cookies,浏览器会存储这些Cookies并在后续的HTTP请求中将它们发送到服务器。
  • 使用Session:在服务器端,可以为每个用户创建一个会话(session)对象来存储在不同请求之间需要共享的信息。
  • 使用URL参数:在URL中传递信息,通常用于GET请求。
  • 使用POST数据:POST请求可以在请求体中发送数据。
  • 使用HTTP头部:可以自定义头部来传递额外的信息,如认证令牌等。
  • 使用Web存储API:例如localStorage或sessionStorage,在客户端存储数据。
  • 使用WebSockets:这是一个全双工通信协议,可以在客户端和服务器之间建立一个持续的连接,从而可以在多个请求之间共享状态。

ASP.NET Core传统授权的基本配置

使用中间件:

app.UseAuthentication();
app.UseAuthorization();

在 Program 中添加配置鉴权: 

    public class FourthController : Controller{/// <summary>/// 正常访问的页面/// </summary>/// <returns></returns>[Authorize]public IActionResult Index(){ return View();}/// <summary>/// 登录页/// </summary>/// <returns></returns>[HttpGet]public IActionResult Login(){return View();}}

在浏览器输入 http://localhost:5999/Fourth/Index

因为Index 添加了[Authorize],在鉴权时只要找到用户信息就可以访问,否则跳转到 Login 页面 。

简单的登录功能

添加 model

    public class CurrentUser{public int Id { get; set; }[Display(Name = "用户名")]public string? Name { get; set; }public string? Account { get; set; }[Display(Name = "密码")]public string? Password { get; set; }[DataType(DataType.EmailAddress)][Display(Name = "E-mail")]public string? Email { get; set; }public DateTime LoginTime { get; set; }}

登录页面

@using Learn.NET6.Project.Models;@model CurrentUser
@{ViewBag.Title = "登录";
}<h2>登录</h2>
<div class="row"><div class="col-md-8"><section id="loginForm">@using (Html.BeginForm("Login", "Fourth", new { sid = "123", Account = "yika" },FormMethod.Post, true, new { @class = "form-horizontal", role = "form" })){@Html.AntiForgeryToken()<hr />@Html.ValidationSummary(true)<div class="mb-3 row">@Html.LabelFor(m => m.Name, new { @class = "col-sm-1 col-form-label" })<div class="col-md-6">@Html.TextBoxFor(m => m.Name, new { @class = "form-control", @placeholder = "请输入您的用户名" })</div></div><div class="mb-3 row">@Html.LabelFor(m => m.Password, new { @class = "col-md-1 control-label" })<div class="col-md-6">@Html.PasswordFor(m => m.Password, new { @class = "form-control", @placeholder = "请输入密码" })</div></div><div class="mb-3 row"><div class="col-md-offset-2 col-md-6"><button type="submit" class="btn btn-primary mb-3">登录</button>@base.ViewBag.Msg</div></div>}</section></div>
</div> 

点击按钮提交

        /// <summary>/// 提交/// </summary>/// <param name="name"></param>/// <param name="password"></param>/// <returns></returns>[HttpPost]public async Task<IActionResult> Login(string name, string password){if ("yika".Equals(name) && "1".Equals(password)){var claims = new List<Claim>()//鉴别你是谁,相关信息{new Claim("Userid","1"),new Claim(ClaimTypes.Role,"Admin"),new Claim(ClaimTypes.Role,"User"),new Claim(ClaimTypes.Name,$"{name}--来自于Cookies"),new Claim(ClaimTypes.Email,$"19998888698@163.com"),new Claim("password",password),//可以写入任意数据new Claim("Account","Administrator"),new Claim("role","admin"),new Claim("QQ","1025025050")};ClaimsPrincipal userPrincipal = new ClaimsPrincipal(new ClaimsIdentity(claims, "Customer"));HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, userPrincipal, new AuthenticationProperties{ExpiresUtc = DateTime.UtcNow.AddMinutes(30),//过期时间:30分钟}).Wait();var user = HttpContext.User;return base.Redirect("/Fourth/Index");}else{base.ViewBag.Msg = "用户或密码错误";}return await Task.FromResult<IActionResult>(View());}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Docker 推送镜像到私有仓库【真实案例】
  • 【Oracle19c】手工数据统计信息并导入dmp数据
  • LeetCode128.最长连续序列
  • select模型实现TCP聊天室
  • 聚星文社推文软件
  • Qt/QML学习-ScrollView
  • 【TS】函数重载的作用
  • 超简单亿图图示安装教程/快速入门指南及快捷键大全
  • C++拾趣——使用VSCode跨平台调试CMake编译的C/C++项目
  • 微信小程序实例代码解读
  • 数据结构--图(笔记)
  • 滑块缺口研究实例(C#颜色滑块缺口计算)
  • 【STM32 Blue Pill编程】-读取数字引脚输入
  • 回顾前面刷过的算法(6)
  • web前端之vue+element+select实现多选、两个数组排序、保持源数据、查找索引、过滤、克隆、复制、findIndex、filter
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • [Vue CLI 3] 配置解析之 css.extract
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Facebook AccountKit 接入的坑点
  • HTML中设置input等文本框为不可操作
  • iOS | NSProxy
  • Laravel核心解读--Facades
  • magento 货币换算
  • nginx 配置多 域名 + 多 https
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • React-redux的原理以及使用
  • supervisor 永不挂掉的进程 安装以及使用
  • Vue官网教程学习过程中值得记录的一些事情
  • 基于web的全景—— Pannellum小试
  • 扑朔迷离的属性和特性【彻底弄清】
  • 区块链分支循环
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 什么软件可以剪辑音乐?
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 微服务入门【系列视频课程】
  • 问题之ssh中Host key verification failed的解决
  • 一个JAVA程序员成长之路分享
  • HanLP分词命名实体提取详解
  • #{} 和 ${}区别
  • #100天计划# 2013年9月29日
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (层次遍历)104. 二叉树的最大深度
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (分布式缓存)Redis分片集群
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (含笔试题)深度解析数据在内存中的存储
  • (九十四)函数和二维数组
  • (四)Android布局类型(线性布局LinearLayout)
  • (四)进入MySQL 【事务】
  • (一) springboot详细介绍
  • (一)80c52学习之旅-起始篇