asp.net core系列 49 Identity 授权(上)

原文: asp.net core系列 49 Identity 授权(上)

一.概述

         授权是指用户能够访问资源的权限,如页面数据的查看、编辑、新增、删除、导出、下载等权限。ASP.NET Core 授权提供了多种且灵活的方式,包括:Razor pages授权约定、简单授权、Role角色授权、Claim声明授权、Policy策略授权、资源授权、视图授权。

 

  1.1 Razor pages约定授权

    Razor pages约定授权用于Razor page应用程序,以及MVC中的Identity  Razor Pages库,不适应于MVC中的控制器和视图。如下图适用MVCIdentity Razor Pages库:

    

分享图片

    对于Razor pages应用程序,访问权限可以在启动时使用授权约定(Startup.cs),这些约定可为用户授权,并允许匿名用户访问各个页面文件夹。可以使用cookie 身份验证或ASP.NET Core Identity来进行授权约定。下面是MVC项目添加个人账户后,认Razor pages约定授权配置如下:

      services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
              .AddRazorPagesOptions(options =>
              {
                  options.AllowAreas = true;
                  //需要授权的用户(登录成功),才能访问区域文件夹(Identity/Account/Manage)
                  options.Conventions.AuthorizeAreaFolder("Identity","/Account/Manage");
                  //需要授权的用户(登录成功),才能访问区域页面(Identity/Account/logout.cshtml)
                  options.Conventions.AuthorizeAreaPage("Identity","/Account/logout");
              });

    如果是Razor page应用程序,约定授权pages目录下的页面文件夹(不带区域),如下所示:

 services.AddMvc()
    .AddRazorPagesOptions(options =>
    {
        //需要授权访问的页面文件夹。
        options.Conventions.AuthorizePage("/Contact");
        options.Conventions.Authorizefolder("/Private");
        //允许匿名访问的页面文件夹。
        options.Conventions.AllowAnonymousToPage("/Private/PublicPage");
        options.Conventions.AllowAnonymousToFolder("/Private/PublicPages");
    })
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

     下面是组合授权和匿名访问:

     //授权访问的文件夹和允许匿名的文件
    .Authorizefolder("/Private").AllowAnonymousToPage("/Private/Public")    
     //允许匿名访问的文件夹和需要授权访问的文件
    .AllowAnonymousToFolder("/Public").AuthorizePage("/Public/Private")

  

  1.2 简单授权

    简单授权是任何经过身份验证的用户能够访问的资源。使用过滤器属性:授权[Authorize]或匿名[AllowAnonymous],[Authorize]对应Authorizefilter过滤器,在mvc中可以应用于一个action或Controller,在razor page中可以应用于一个页面模型类PageModel,但不能应用于页面处理程序方法。razor page中简单授权如下所示:

   //需要授权访问的logout页面
    [Authorize]
    public class logoutModel : PageModel
    {

   //允许匿名访问的Login页面
    [AllowAnonymous]
    public class LoginModel : PageModel
    {

     注意:对于约定授权和简单授权都是只针对,经过身份验证的用户都能访问的资源。也就是只要登录成功的用户都能访问的资源。

    

 

  1.3 基于role角色授权       

    当创建用户时,它可能属于一个或多个角色。比如:张三可能属于管理员用户角色,同时李四只是用户角色。创建和管理这些角色取决于授权过程的后备存储,角色验证是通过ClaimsPrincipal类上的IsInRole方法,IsInRole检查当前用户属于该角色,返回bool类型。关联着role角色表、UserRole用户关联角色表。

    基于角色的授权检查是声明性的,声明在控制器或action上,检查当前用户请求资源的权限,用户关联角色, 检查角色成员拥有的权限。

    下面是限制AdministrationController,只有Administrator角色成员的用户才能访问:

    [Authorize(Roles = "Administrator")]
    public class AdministrationController : Controller
    {
    }

    多个角色指定为逗号分隔列表:

    [Authorize(Roles = "HRManager,Finance")]
    public class SalaryController : Controller
    {
    }

    在action级别应用其他角色授权属性,来进一步限制访问:

[Authorize(Roles = "Administrator,PowerUser")]
public class ControlPanelController : Controller
{
    public ActionResult SetTime()
    {
    }

    [Authorize(Roles = "Administrator")]
    public ActionResult ShutDown()
    {
    }
}

     还可以锁定控制器(简单授权),但允许匿名(未经身份验证)对单个action访问。

[Authorize]
public class ControlPanelController : Controller
{
    public ActionResult SetTime()
    {
    }

    [AllowAnonymous]
    public ActionResult Login()
    {
    }
}

     对于Razor Pages应用程序,可以使用上面讲的约定授权,也可以运用AuthorizeAttribute到pageModel上,如下所示:

[Authorize(Policy = "RequireAdministratorRole")]
public class UpdateModel : PageModel
{
    public ActionResult OnPost()
    {
    }
}

    下面示例来演示role角色授权:

      (1) 创建AdministrationController,应用Authorize。

    [Authorize(Roles = "Administrator")]
    public class AdministrationController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }

       (2) 登录成功后,访问Administration资源,显示拒绝,如下所示:

        

分享图片

      (3) 添加role角色表和UserRole用户角色表

        

分享图片

      (4) 用户退出,再登录,访问Administration资源,OK

 

  1.4 基于Claim声明授权

    创建一个用户时,它可能会分配一个或多个Claims声明。Claims声明是表示哪些使用者名称值对。基于Claims声明的授权,将检查Claims声明的值,并允许对基于该值资源的访问。关联着UserClaim用户声明表

    (1) 添加Claims策略

      首先在Startup.cs文件中,需要注册策略policy,下面示例中策略名称是EmployeeOnly,策略类型ClaimType是EmployeeNumber,还可以包括策略类型值。

    services.AddAuthorization(options =>
    {
        options.AddPolicy("EmployeeOnly",policy => policy.RequireClaim("EmployeeNumber"));
        //或者一个策略带有claimType类型和requiredValues值
        //options.AddPolicy("EmployeeOnly",policy => policy.RequireClaim("EmployeeNumber","1","2","3","4","5"));
    });

    (2) 将policy策略名称应用在控制器上

      [Authorize(Policy = "EmployeeOnly")]
      public class EmployeeController : Controller
      {
          // GET: /<controller>/
          public IActionResult Index()
          {
              return View();
          }
      }

    (3) 用户登录,访问Employee资源,访问拒绝

      

分享图片

    (4) 在UserClaim声明表插入一条数据(上面注册EmployeeOnly声明策略,只要求验证claimType类型。所以表中claimvalue的1值不启作用, 如果要表中claimvalue启作用,可以在注册EmployeeOnly时输入requiredValues值)

      

分享图片

    (5) 用户退出,再登录,访问Employee资源,OK

 

  参考文献

    授权

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


本文将从上往下,循序渐进的介绍一系列相关.NET的概念,先从类型系统开始讲起,我将通过跨语言操作这个例子来逐渐引入一系列.NET的相关概念,这主要包括:CLS、...
基于 .NET 的一个全新的、好用的 PHP SDK + Runtime: PeachPie 来啦!
.NET 异步工作原理介绍。
引子 .NET 6 开始初步引入 PGO。PGO 即 Profile Guided Optimization,通过收集运行时信息来指导 JIT 如何优化代码,相比以前没有 PGO 时可以做更多以前难以
前言 2021/4/8 .NET 6 Preview 3 发布,这个版本的改进大多来自于底层,一起来看看都有什么新特性和改进吧。 库改进 新增值类型作为字典值时更快的处理方法 .NET 6 Previ
前言 开头防杠:.NET 的基础库、语言、运行时团队从来都是相互独立各自更新的,.NET 6 在基础库、运行时上同样做了非常多的改进,不过本文仅仅介绍语言部分。 距离上次介绍 C# 10 的特性已经有
直接使用 CIL - .NET 上的汇编语言编写 .NET Standard 类库
前言 不知不觉中,.NET Framework 已经更新到 4.8,.NET Core 也更新到了 3.0 版本。那么 .NET 的未来怎么样呢? 计划 2019 年 Build 大会上,微软宣布下一
本文带你穿越到未来一起看看未来的 C# 到底长什么样子。
前言 TypedocConverter 是我先前因帮助维护 monaco-editor-uwp 但苦于 monaco editor 的 API 实在太多,手写 C# 的类型绑定十分不划算而发起的一个项
前言 在 2021 年 3 月 11 日, .NET 6 Preview 2 发布,这次的改进主要涉及到 MAUI、新的基础库和运行时、JIT 改进。 .NET 6 正式版将会在 2021 年 11
前言 命名空间已经在 .NET 中使用了多年,一直追溯到 .NET Framework 1.1。它在 .NET 实施本身的数百个位置中使用,并且直接被成千上万个应用程序使用。在所有这些方面,它也是 C
.NET 上的统一跨平台 UI 框架来啦
使用 F# 手写一个 Typedoc 转 C# 代码生成器,方便一切 C# 项目对 TypeScript 项目的封装。
LINQ + SelectMany = Monad!
C# 10 主要特性一览
C# 的编译期反射终于来啦!
前言 2021 年 2 月 17 日微软发布了 .NET 6 的 Preview 1 版本,那么来看看都有什么新特性和改进吧,由于内容太多了因此只介绍一些较为重点的项目。ASP.NET Core 6
前言 有一个东西叫做鸭子类型,所谓鸭子类型就是,只要一个东西表现得像鸭子那么就能推出这玩意就是鸭子。 C 里面其实也暗藏了很多类似鸭子类型的东西,但是很多开发者并不知道,因此也就没法好好利用这些东西,
经过五年半的持续维护,Senparc.Weixin SDK 逐步丰满和完善,在升级的过程中,我们为基础库(Senparc.Weixin.dll)加入了许多通用的功能,例如加密/解密算法、通用缓存方法等