一.概述

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

  1.1 Razor pages约定授权

    Razor pages约定授权用于Razor page应用程序,以及MVC中的Identity  Razor Pages库,不适应于MVC中的控制器和视图。如下图适用MVC中Identity 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

  参考文献

    授权

asp.net core系列 49 Identity 授权(上)的更多相关文章

  1. asp.net core系列 51 Identity 授权(下)

    1.6 基于资源的授权 前面二篇中,熟悉了五种授权方式(对于上篇讲的策略授权,还有IAuthorizationPolicyProvider的自定义授权策略提供程序没有讲,后面再补充).本篇讲的授权方式 ...

  2. asp.net core系列 50 Identity 授权(中)

    1.5 基于策略的授权 在上篇中,已经讲到了授权访问(authorization)的四种方式.其中Razor Pages授权约定和简单授权二种方式更像是身份认证(authentication) ,因为 ...

  3. asp.net core系列 46 Identity介绍

    一. Identity 介绍 ASP.NET Core Identity是一个会员系统,可为ASP.NET Core应用程序添加登录功能.可以使用SQL Server数据库配置身份以存储用户名,密码和 ...

  4. asp.net core系列 52 Identity 其它关注点

    一.登录分析 在使用identity身份验证登录时,在login中调用的方法是: var result = await _signInManager.PasswordSignInAsync(Input ...

  5. asp.net core系列 48 Identity 身份模型自定义

    一.概述 ASP.NET Core Identity提供了一个框架,用于管理和存储在 ASP.NET Core 应用中的用户帐户. Identity添加到项目时单个用户帐户选择作为身份验证机制. 默认 ...

  6. asp.net core系列 47 Identity 自定义用户数据

    一.概述 接着上篇的WebAppIdentityDemo项目,将自定义用户数据添加到Identity DB,自定义扩展的用户数据类应继承IdentityUser类, 文件名为Areas / Ident ...

  7. asp.net core 系列 10 配置configuration (上)

    一.  ASP.NET Core 中的配置概述 ASP.NET Core 中的应用配置是基于键值对,由configuration 程序提供. configuration  将从各种配置源提供程序操作键 ...

  8. 【目录】asp.net core系列篇

    随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...

  9. Asp.net Core 系列之--5.认证、授权与自定义权限的实现

    ChuanGoing 2019-11-24 asp.net core系列已经来到了第五篇,通过之前的基础介绍,我们了解了事件订阅/发布的eventbus整个流程,初探dapper ORM实现,并且简单 ...

随机推荐

  1. 哈夫曼树【最优二叉树】【Huffman】

    [转载]只为让价值共享,如有侵权敬请见谅! 一.哈夫曼树的概念和定义 什么是哈夫曼树? 让我们先举一个例子. 判定树:         在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设 ...

  2. 分布式爬虫框架XXL-CRAWLER

    <分布式爬虫框架XXL-CRAWLER> 一.简介 1.1 概述 XXL-CRAWLER 是一个分布式爬虫框架.一行代码开发一个分布式爬虫,拥有"多线程.异步.IP动态代理.分布 ...

  3. invalid bound statement (not found)

    invalid bound statement (not found) mybatis 错误: 一般是Mapepr.xml文件中文nameapce没有和mapper接口发生映射,导致mybatis绑定 ...

  4. 高通spi 屏幕 -lk代码分析

    lk SPI驱动 1. 初始化时钟 在lk中,我们是从kmain开始执行下来的,而执行顺序则是先初始化时钟,也就是在platform_early_init函数中开始执行的: 在这里我们需要修改这个函数 ...

  5. 进阶-JMS 知识梳理

    JMS 一. 概述与介绍 ActiveMQ 是Apache出品,最流行的.功能强大的即时通讯和集成模式的开源服务器.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Pro ...

  6. mfc动态演示排序算法

    实现的排序算法 冒泡排序.选择排序.快速排序 具体实现 选用mfc中的单文档框架 ①SetTimer函数的用法. ②使用画笔画直线. ③使用FillSolidRect()函数覆盖某一矩形区域内的内容: ...

  7. VirtualBox报错:不能为虚拟电脑XXX打开一个新任务

    报错产生的背景 今天在这里下载了一个用于VirtualBox的Kali Linux虚拟机文件(使用VirtualBox可以直接打开使用,不用执行安装过程).但是将该文件导入到VirtualBox中之后 ...

  8. Javascript 中的map/reduce

    先填个坑,后面慢慢填 附上一篇不错的文章:https://segmentfault.com/a/1190000008719824

  9. CentOS安装JAVA

    http://hermosa-young.iteye.com/blog/1798026 每次都要搜索一下太麻烦了,留个底,方便以后查询 一般情况下,我们都要将linux自带的OPENJDK卸载掉,然后 ...

  10. SimpleXML系列函数操作XML

    创建SimpleXML对象 种方法来创建对象,分别是: l  Simplexml_load_file()函数,将指定的文件解析到内存中. l  Simplexml_load_string()函数,将创 ...