.NET Core中鉴权 Authentication Authorization

news/2024/5/19 22:08:43 标签: .netcore
  • Authentication: 鉴定身份信息,例如用户有没有登录,用户基本信息

  • Authorization: 判定用户有没有权限

使用框架提供的Cookie鉴权方式

1.首先在服务容器注入鉴权服务和Cookie服务支持

services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;//不能少
    options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = "Cookie/Login";
})
.AddCookie(options =>{});

2.注册鉴权和授权中间件,用于在管道中调用拦截校验鉴权和授权

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

3.在控制器引入特性 [Authorize] ,调用登录接口时使用HttpContext.SignInAsync()写入鉴权信息

        [AllowAnonymous]
        [HttpPost]
        public async Task<IActionResult> LoginAsync(string name, string password)
        {
            //用户名密码不正确直接返回
            if (!"Admin".Equals(name) || !"123456".Equals(password))
            {
                return new JsonResult(new { Result = false, Message = "登录失败" });
            }

            var claimIdentity = new ClaimsIdentity("Cookie");
            claimIdentity.AddClaim(new Claim(ClaimTypes.Name, name));
            claimIdentity.AddClaim(new Claim(ClaimTypes.Email, "MyEmail@qq.com"));
            claimIdentity.AddClaim(new Claim(ClaimTypes.System, "EmployeeManager"));

            var Properties = new AuthenticationProperties
            {
                ExpiresUtc = DateTime.UtcNow.AddMinutes(30),
            };

            //写入鉴权信息
            await base.HttpContext.SignInAsync(new ClaimsPrincipal(claimIdentity), Properties);
            return new JsonResult(new { Result = true, Message = "登录成功" });
        }

4.因为调用 HttpContext.AuthenticateAsync() 获取鉴权的步骤,由第二部注册的中间件AuthenticationMiddleware已经替我们完成,所以可以直接在控制器内部获取HttpContext.User信息,系统提供的相对于自己实现的,框架帮我们封装了获取鉴权信息,并把它加入管道中,而不用每次在控制器中手动获取鉴权信息。

        [HttpGet]
        public IActionResult Authentication()
        {
            //这里由中间件管道已经实现了鉴权信息取值
            var CookiesInfo = base.HttpContext.User;
            if (CookiesInfo != null)
            {
                return new JsonResult(new { Result = true, Message = $"鉴权认证成功,用户已登录" });
            }
            return new JsonResult(new { Result = true, Message = $"鉴权认证失败,用户未登录" });
        }

http://www.niftyadmin.cn/n/5273550.html

相关文章

课题学习(十七)----姿态更新的四元数算法总结

声明&#xff1a;因为接触本课题时间不长&#xff0c;对于四元数解法一直没太懂什么意思&#xff0c;本篇博客就对这几天的学习进行总结&#xff0c;肯定会有错误&#xff0c;希望读者能够帮忙指正。本篇博客主要参考秦永元老师《惯性导航》第九章第二小节以及几篇论文。 一、…

​curses --- 终端字符单元显示的处理​

源代码: Lib/curses curses 模块提供了 curses 库的接口&#xff0c;这是可移植高级终端处理的事实标准。 虽然 curses 在 Unix 环境中使用最为广泛&#xff0c;但也有适用于 Windows&#xff0c;DOS 以及其他可能的系统的版本。此扩展模块旨在匹配 ncurses 的 API&#xff0c…

多模光纤如何实现40G/100G网络升级?

随着云计算、大数据和物联网技术的普及&#xff0c;许多数据中心正在逐步将网络升级至40/100G以实现高速传输。 目前&#xff0c;40GbE的核心技术已经相当成熟&#xff0c;从10G升级到40G也相对简便。然而&#xff0c;对于那些快速发展的企业以及需要更高带宽和扩展网络的数据中…

Axure中继器的使用

目录 一. 中继器 概述 作用 运用场景 二. 中继器的使用 三. 三列表格增删改查案例展示 一. 中继器 概述 在Axure软件中&#xff0c;中继器&#xff08;Repeater&#xff09;是一种特殊的控件&#xff0c;它的作用是允许用户创建重复的数据项&#xff0c;并以列表或表格…

【华为OD题库-097】最大岛屿体积-java

题目 题目描述 给你一个由大于0的数&#xff08;陆地)和0(水)组成的的二维网格&#xff0c;请你计算网格中最大岛屿的体积。陆地的数表示所在岛屿的体积。岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以假…

从 MySQL 到 DolphinDB,Debezium + Kafka 数据同步实战

Debezium 是一个开源的分布式平台&#xff0c;用于实时捕获和发布数据库更改事件。它可以将关系型数据库&#xff08;如 MySQL、PostgreSQL、Oracle 等&#xff09;的变更事件转化为可观察的流数据&#xff0c;以供其他应用程序实时消费和处理。本文中我们将采用 Debezium 与 K…

vscode使用remote ssh到server上 - Node进程吃满CPU

起因&#xff1a;Node进程吃满CPU 分析 我发现每次使用vscode的remote插件登陆到server后&#xff0c;就会出现node进程&#xff0c;不太清楚干什么用的&#xff0c;但是绝对和它有关。 查找原因 首先找到了这篇文章&#xff0c;解决了rg进程的问题&#xff1a; https://blo…

LeetCode(Hot100)——7:数字反转

复习 &#xff08;1&#xff09;char charAt(int index) 返回指定索引处的 char 值。 &#xff08;2&#xff09;String substring(int beginIndex, int endIndex) 返回一个新字符串&#xff0c;它是此字符串的一个子字符串。 &#xff08;3&#xff09;String substring(int …