ASP.NET Core MVC 从入门到精通之鉴权授权基础

news2024/11/20 0:32:00

随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。

经过前几篇文章的讲解,初步了解ASP.NET Core MVC项目创建,启动运行,以及命名约定,创建控制器,视图,模型,接收参数,传递数据ViewData,ViewBag,路由,页面布局,wwwroot和客户端库,Razor语法,EnityFrameworkCore与数据库,HttpContext,Request,Response,Session,序列化,文件上传,自动映射,Html辅助标签,模型校验等内容,今天继续讲解ASP.NET Core MVC 中鉴权、授权基础等相关内容,仅供学习分享使用。

概述

在实际开发中,大部分程序都是要进行身份验证,才能进行访问,没有身份验证的访问,安全性就得不到保证,很容易被加以利用和攻击。身份验证就等于在应用程序中,增加了一层防护网。示意图如下所示:

什么是鉴权,授权?

鉴权,又叫身份验证,确定用户身份的过程。

授权,确定用户是否有权访问资源的过程。

在 ASP.NET Core 中,身份验证由身份验证服务 IAuthenticationService 负责,而它供身份验证中间件使用。 身份验证服务会使用已注册的身份验证处理程序来完成与身份验证相关的操作。 与身份验证相关的操作示例包括:

  • 对用户进行身份验证。
  • 在未经身份验证的用户试图访问受限资源时作出响应。

已注册的身份验证处理程序及其配置选项被称为“方案”。身份验证负责提供 ClaimsPrincipal 进行授权,以针对其进行权限决策。

关于鉴权,授权,可以通过以下示例说明:

 鉴权是一个承上启下的一个环节,上游它接受授权的输出,校验其真实性后,然后获取权限(permission),这个将会为下一步的权限控制做好准备。

鉴权授权基本步骤

在ASP.NET Core MVC程序中,要使用鉴权,授权功能,可参考以下步骤。

1. 添加鉴权服务

首先鉴权服务,本示例采用cookie的方式进行身份验证,Program.cs启动类中,添加鉴权服务,如下所示:

//添加鉴权服务
builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;

}).AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
    options.LoginPath = "/Login/Index";
    options.LogoutPath = "/Login/Logout";
});

注意,添加服务时,指定了默认的schema。以及在没有授权时,需要跳转的登录的页面。

2. 添加鉴权,授权中间件

在Program.cs启动类中,添加身份验证和授权中间件,以便在客户端访问时进行验证。

//使用鉴权
app.UseAuthentication();
//使用授权
app.UseAuthorization();

3. 添加Authorize权限控制

在需要进行权限控制的地方【如:Cotroller,Action ,Razor页面】,添加Authorize特性,如Home控制器,如下所示:

namespace DemoCoreMVC.Controllers
{
    [Authorize]
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public IActionResult Index()
        {
            var username = HttpContext.Session.GetString("username");
            ViewBag.Username = username;
            return View();
        }

        public IActionResult Privacy()
        {
            return View();
        }

    }
}

如此,添加Authorize特性后,在访问Home/Index首页时,如没有鉴权,则会跳转到登录页面。

4. 鉴权

在用户登录后,通过HttpContext.SignInAsync进行鉴权,并设置ClaimsPrincipal。如下所示:

namespace DemoCoreMVC.Controllers
{
    public class LoginController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }

        public async  Task<IActionResult> Login()
        {
            var username = Request.Form["username"];
            var password = Request.Form["password"];
            if(username=="admin" && password == "abc123")
            {
                HttpContext.Session.SetString("username", username);
            }
            var claimsIdentity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
            claimsIdentity.AddClaim(new Claim(ClaimTypes.Name,username));
            claimsIdentity.AddClaim(new Claim(ClaimTypes.Role,"Admin"));
            var claimPrincipal = new ClaimsPrincipal(claimsIdentity);
            await HttpContext.SignInAsync(claimPrincipal);
            return Redirect("/Home");
        }

        public async Task<IActionResult> Logout()
        {
            await HttpContext.SignOutAsync();
            return Redirect("/Login");
        }
    }
}

在示例中,设置了ClaimTypes为Name和Role两个内容,可以为后续授权使用。

5. 测试

在启动时,由于没有进行身份验证,所以默认Home/Index跳转到了Login页面,当输入密码登录后,即可进行正常跳转,如下所示:

且通过F12查看开发者工具,发现多了一个Cookie信息,这就是在后续访问的时候,都会带上作为凭证的验证信息。如下所示:

授权区分

在实际应用中,经常遇到有些功能是管理员权限才有,有些权限普通角色也可以查看。

则可以在Authorize特性中加以区分,[Authorize(Roles ="Admin,SuperAdmin")]。Authorize特性共有以几个属性可以设置:

namespace Microsoft.AspNetCore.Authorization
{
    //
    // 摘要:
    //     Specifies that the class or method that this attribute is applied to requires
    //     the specified authorization.
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
    public class AuthorizeAttribute : Attribute, IAuthorizeData
    {
        //
        // 摘要:
        //     Initializes a new instance of the Microsoft.AspNetCore.Authorization.AuthorizeAttribute
        //     class.
        public AuthorizeAttribute();
        //
        // 摘要:
        //     Initializes a new instance of the Microsoft.AspNetCore.Authorization.AuthorizeAttribute
        //     class with the specified policy.
        //
        // 参数:
        //   policy:
        //     The name of the policy to require for authorization.
        public AuthorizeAttribute(string policy);

        //
        // 摘要:
        //     Gets or sets the policy name that determines access to the resource.
        public string? Policy { get; set; }
        //
        // 摘要:
        //     Gets or sets a comma delimited list of roles that are allowed to access the resource.
        public string? Roles { get; set; }
        //
        // 摘要:
        //     Gets or sets a comma delimited list of schemes from which user information is
        //     constructed.
        public string? AuthenticationSchemes { get; set; }
    }
}

以上就是ASP.NET Core MVC 从入门到精通之鉴权授权基础的全部内容。

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

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

相关文章

在 ZBrush、Substance 3D Painter 和 UE5 中创作警探角色(P2)

大家好&#xff0c;下篇分享咱们继续来说警探角色的重新拓扑、UV、材质贴图和渲染处理。 重新拓扑/UV 这是对我来说最不有趣的部分——重新拓扑。它显然是实时角色中非常重要的一部分&#xff0c;不容忽视&#xff0c;因为它会影响大量的 UV、绑定和后期渲染&#xff0c;这里…

从零开始 Spring Boot 42:异步执行

从零开始 Spring Boot 42&#xff1a;异步执行 图源&#xff1a;简书 (jianshu.com) 在之前的文章中&#xff0c;我多次介绍过在 Spring 中如何使用Async注解让方法调用变成“异步执行”&#xff1a; 在这篇文章中&#xff0c;介绍了如何让定时任务使用Async变成异步执行。在…

​达梦三种主备集群介绍

DM主备守护集群分为实时主备、读写分离集群、MPP主备集群。基于redo日志实现&#xff0c;不同的集群采用不同的redo日志归档类型。 实时主备&#xff1a; 实时主备系统由主库、实时备库、守护进程和监视器组成。通过部署实时主备系统&#xff0c;可以及时检测并处理各种硬件故…

GIS大数据处理框架sedona(塞多纳)编程入门指导

GIS大数据处理框架sedona(塞多纳)编程入门指导 简介 Apache Sedona™是一个用于处理大规模空间数据的集群计算系统。Sedona扩展了现有的集群计算系统&#xff0c;如Apache Spark和Apache Flink&#xff0c;使用一组开箱即用的分布式空间数据集和空间SQL&#xff0c;可以有效地…

【备战秋招】每日一题:2023.05-B卷-华为OD机试 - 2023.05-B卷-华为OD机试 - AI面板识别

2023大厂笔试模拟练习网站&#xff08;含题解&#xff09; www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据&#xff0c;挂载到我们的OJ上&#xff0c;供大家学习交流&#xff0c;体会笔试难度。现已录入200道互联网大厂模拟练习题&a…

【双曲几何学 02】什么是极点和极线?

一、说明 Pole and polar 对于几何学&#xff0c;是普遍的概念。可能高中就学过&#xff0c;问题是在双曲几何又用到这个概念&#xff0c;因此&#xff0c;这里再次强调理解这个概念 。为后边学习双曲几何扫清障碍。 二、基本概念 在几何学中&#xff0c;极点和极线分别是相对于…

NetSuite SuiteQlet 功能包

目录 1.前言 2.功能说明 2.1术语 2.2功能概述 2.3逻辑阐释 3.安装 4.权限配置 ​​​5.操作指南 5.1Query查询 5.2Chart图表 5.3Dashboard仪表板发布 6.注意事项 7.视频链接 1.前言 SuiteQL是NetSuite数据分析框架中进行数据查询的有力工具&#xff0c;使用得当则…

华为云CodeArtBuild减负!云端编译构建,让你的开发省时省力!

每一个剑客都需要一把趁手的利器&#xff0c;初学者如何利用编译软件&#xff1f;只需五分钟&#xff0c;带你体验软件开发的效率。 请注册华为云账号并完成实名认证&#xff0c;实验过程中请使用Chrome浏览器完成相关操作。 华为云账号注册步骤请参考&#xff1a; ​​http…

介质中的平面电磁波与色散效应

目录 理想介质中的平面电磁波 方程推导 解的讨论 ​​​​​​​瞬时形式 等相面 参数讨论 导电媒质中的均匀平面波 方程推导 解的讨论 波的特征分析 色散效应的讨论 理想介质中的平面电磁波 方程推导 已知两个方程 我们如果令 方程就可以化简为 这两个方程在数学…

《C++ Primer》--学习1

变量和基本类型 NULL是一个预处理变量&#xff0c;用NULL初始化指针和用0初始化指针是一样的&#xff08;但是不可以直接用值为0的int变量来初始化&#xff09;&#xff0c;应该尽量用nullptr&#xff0c;避免使用NULL 指向指针的指针 声明符中修饰符的个数并没有限制&#…

redis中sort妙用,实现动态生成排行榜

在游戏中&#xff0c;有很多维度的排行榜&#xff0c;服务器在实现过程中&#xff0c;一般都要预先维护对应因子的zset&#xff0c;比如根据玩家等级来排序&#xff0c;那就需要对应有一个level作为score的zset&#xff0c;如果是以战斗力排序&#xff0c;那就用战力作为score维…

微服务基础介绍

Part1一、基本概念 微服务最主要的功能是根据业务拆分成一个一个的子服务&#xff0c;实现功能的去耦合&#xff0c;每一个微服务提供单个业务功能的服务&#xff0c;各司其职&#xff0c;从技术角度看就是一种灵活独立的单元&#xff0c;能够自行单独启动和关闭&#xff0c;一…

亚马逊云科技中国峰会:自主驾驶开发平台 Amazon DeepRacer

0.引言 自动驾驶技术的快速发展和应用前景已经引起了广泛的关注&#xff0c;毋庸讳言&#xff0c;无人驾驶已经成为当今及未来前沿科技公司的重点研究方向。在这个领域中&#xff0c;Amazon DeepRacer作为一款全面的自主驾驶开发平台备受瞩目。 1.了解Amazon DeepRacer 1.1 什…

什么是消息队列(MQ)

其实字面意思很清楚了&#xff0c;存放消息的队列。 由于它的应用场景在服务器方面被重新定义而名声大噪&#xff0c;它的价值也被由原先的通信而重新定义&#xff0c;成为高并发场景下&#xff0c;分布式系统解耦合&#xff0c;任务异步&#xff0c;流量削峰的利器。 其实消息…

【flink】SinkUpsertMaterializer

在flink cdc同步数据时&#xff0c;基于sql的实现方式中发现了作业DAG有个SinkMaterializer算子&#xff0c;而且检查checkpoint历史时发现该算子state越来越大&#xff0c; 有必要搞清楚为什么会多了这个算子&#xff0c;作用又是什么。 通过算子名称定位到了源码为类org.apa…

常用API(String,ArrayList)

1:String类概述 String是字符串类型&#xff0c;可以定义字符串变量指向字符串对象String是不可变字符串的原因&#xff1f;1.String变量每次的修改都是产生并指向新的字符串对象。2.原来的字符串对象都是没有改变的&#xff0c;所以称不可变字符串。 2&#xff1a;String创建…

一文搞懂VOS费率前缀、地区前缀的区别和使用

登录VOS3000客户端 进入费率管理 "VOS费率前缀"和"地区前缀"的主要区别如下: VOS费率前缀:VOS(Voice Over Service)费率前缀是指用于国际长途电话呼叫的特定前缀号码。不同的运营商或服务提供商可能会使用不同的VOS费率前缀,用于标识国际长途通话的费…

49 最佳实践-性能最佳实践-Nvme磁盘直通

文章目录 49 最佳实践-性能最佳实践-Nvme磁盘直通49.1 概述49.2 操作指导 49 最佳实践-性能最佳实践-Nvme磁盘直通 49.1 概述 设备直通技术是一种基于硬件的虚拟化解决方案&#xff0c;通过该技术&#xff0c;虚拟机可以直接连接到指定的物理直通设备上。对于用户来说&#x…

ByteV联合“智农”打造数字孪生高标准农田,助力乡村振兴

ByteV联合“智农”打造的数字孪生高标准农田&#xff0c;不仅要让粮食稳产、增产&#xff0c;更要对土壤肥力进行改良和提升。不仅能够实现科技引领农业发展&#xff0c;更在智慧农业的基础上实现一站式托管&#xff0c;真正做到技术提升、5G引领、建后管护的闭环管理。让高标准…

C语言之指针详解(7)

目录 本章重点 1. 字符指针 2. 数组指针 3. 指针数组 4. 数组传参和指针传参 5. 函数指针 6. 函数指针数组 7. 指向函数指针数组的指针 8. 回调函数 9. 指针和数组面试题的解析 上一篇博客我们说过会把回调函数的一些知识再给大家讲一遍 这里把void*强制类型转化为str…