zoukankan      html  css  js  c++  java
  • 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

      参考文献

        授权

  • 相关阅读:
    sql排序对比(row_number,rank,dense_rank)
    SQL分组排名+行转列
    MS SQL 权限设置脚本
    centos8容器中安装lamp及wordpress
    MacOS禁止向日葵开机启动
    docker(1)
    centos7的firewalld
    ssh免密码
    CENTOS7安装vsftp
    centos 7 安装samba配置匿名共享文件夹
  • 原文地址:https://www.cnblogs.com/MrHSR/p/10641090.html
Copyright © 2011-2022 走看看