当前位置: 移动技术网 > IT编程>开发语言>.net > asp.net core系列 49 Identity 授权(上)

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

2019年04月04日  | 移动技术网IT编程  | 我要评论

唯品会品牌折扣女装,10244最新地址 2017,男生发型设计图片

一.概述

         授权是指用户能够访问资源的权限,如页面数据的查看、编辑、新增、删除、导出、下载等权限。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

 

  参考文献

    

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网