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

随着技术的发展,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 从入门到精通之鉴权授权基础的全部内容。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
ASP.NET Core MVC是一种用于构建Web应用程序的开发框架,具有轻量级、高扩展性和性能优越等特点。下面我将简要介绍ASP.NET Core MVC的入门到精通过程。 入门阶段:首先,你需要掌握C#编程语言和基本的Web开发知识。然后,你可以开始学习ASP.NET Core MVC的基本概念,包括请求-响应模型、控制器、视图和模型等。通过创建简单的应用程序,你可以了解到ASP.NET Core MVC的基本工作原理和项目结构。 进阶阶段:在掌握了基本概念后,你可以深入学习路由、过滤器、身份验证和授权等高级特性。此外,了解如何使用数据库和ORM(对象关系映射)框架与数据进行交互也十分重要。在这个阶段,你可以尝试开发更复杂的应用程序,并学习如何优化性能和处理错误。 精通阶段:在掌握了ASP.NET Core MVC的核心概念和高级特性后,你可以进一步提升你的技能。你可以学习如何使用视图组件、自定义标签帮助器和间件等扩展ASP.NET Core MVC的能力。此外,学习如何进行单元测试和集成测试,以及如何使用日志记录和性能监控工具等也是非常有价值的。 总结起来,要将ASP.NET Core MVC从入门到精通,你需要通过实践来不断巩固你的知识,并深入研究不同的方面和扩展。除此之外,参与开发社区和读一些相关的技术书籍也是提高你的技能和认识的好途径。希望这些信息对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老码识途呀

写作不易,多谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值