使用CLK.AspNet.Identity提供以角色为基础的访问控制(RBAC)

使用CLK.AspNet.Identity提供以角色为基础的访问控制(RBAC)

程序代码下载

程序代码下载:点此下载

前言

ASP.NET Identity是微软所贡献的开源项目,用来提供ASP.NET的验证、授权机制。而在ASP.NET Identity的功能模块中:是采用Claims-Based验证来提供验证机制、并且实作Role-Based授权来提供授权机制。开发人员在系统内套用ASP.NET Identity后,就可以像下列范例一样定义用户属于哪个角色、哪个角色可以使用那些功能,后续用户通过验证之后,就可以依照角色授权来使用系统功能。

ASP.NET Identity授权机制,可以在系统运行中动态变更用户所属的角色,但是却不能动态变更角色可以使用的功能。这是因为在ASP.NET Identity里,使用者属于哪个角色的设定储存于数据库可以动态变更,而角色可以使用那些功能的设定则是定义在程序代码没有办法动态变更。虽然这样的授权机制已经可以符合大部分的开发需求,但在需要动态变更角色使用那些功能的开发项目中,开发人员就没有机会使用到ASP.NET Identity丰富的验证授权机制。

  • 领域模型

  • 角色可以使用那些功能
    public class HomeController : Controller
    {
        [Authorize(Roles = "Admin")]
        public ActionResult Contact() { ... }
    
        [Authorize(Roles = "Guest")]
        public ActionResult Contact() { ... }
    }
    
  • 使用者属于哪个角色

本篇文章介绍一个基于ASP.NET Identity开发设计的验证授权模块:CLK.AspNet.Identity。这个验证授权模块提供以角色为基础的访问控制(Role-based access control, RBAC),将系统授权拆解为User(使用者)、Role(角色)、Permission(权限)。开发人员在系统内套用CLK.AspNet.Identity后,就可以像下列范例一样定义用户属于哪个角色、哪个角色拥有那些权限、权限可以使用哪些功能,后续用户通过验证之后,就可以依照角色权限来使用系统功能。

CLK.AspNet.Identity授权机制,除了可以继续使用继承自ASP.NET Identity的Claims-Based验证机制之外,也可以在系统运行中动态变更储存于数据库的授权设定:使用者所属的角色、角色拥有的权限,让系统的授权设定更加灵活多变,用以满足更多的用户需求。

  • 领域模型

  • 权限可以使用哪些功能
    public class HomeController : Controller
    {
        [RBACAuthorize(Permission = "AboutAccess")]
        public ActionResult Contact() { ... }
    
        [RBACAuthorize(Permission = "ContactAccess")]
        public ActionResult Contact() { ... }
    }
    
  • 权限属于哪个角色

  • 使用者属于哪个角色

安装

  1. 首先开启Visual Studio建立一个「完全空白」的ASP.NET Web 应用程序。

  2. 接着开启NuGet管理工具,搜寻并安装:「CLK.AspNet.Identity.Mvc Template

  3. 安装需要花费一些时间,安装完毕后即可看到必要档案都已加入至项目。

  4. 安装好CLK.AspNet.Identity之后,按下Visual Studio的执行按钮,就可以在浏览器上看到预设的首页内容。

变更角色的权限

  1. 使用预设的访客账号登入(ID:[email protected], PW:guest),点击页面选单按钮:About,因为[email protected]属于Guest群组、而Guest群组没有AboutAccess权限,所以会收到403拒绝访问的页面内容。

  2. 使用预设的管理账号登入(ID:[email protected], PW:admin),点击页面选单按钮:PermissionsAdmin进入权限管理页面,编辑AboutAccess权限,让Guest群组拥有AboutAccess权限。

  3. 更换回预设的访客账号登入(ID:[email protected], PW:guest),点击页面选单按钮:About,因为现在Guest群组拥有AboutAccess权限,所以可以浏览About页面内容。

变更使用者的角色

  1. 使用预设的访客账号登入(ID:[email protected], PW:guest),点击页面选单按钮:Contact,因为[email protected]属于Guest群组、而Guest群组没有ContactAccess权限,所以会收到403拒绝访问的页面内容。

  2. 使用预设的管理账号登入(ID:[email protected], PW:admin),点击页面选单按钮:UsersAdmin进入使用者管理页面,编辑[email protected]使用者,让[email protected]使用者加入到Admin群组。

  3. 更换回预设的访客账号登入(ID:[email protected], PW:guest),点击页面选单按钮:Contact,因为现在[email protected]属于Admin群组,而Admin群组拥有ContactAccess权限,所以可以浏览Contact页面内容。

新增系统的权限

  1. 回到Visual Studio编辑新功能,首先在HomeController增加一个新功能「News」、设定NewsAccess权限可以使用这个功能,并且在Viwes里面加上对应的变更。

    public class HomeController : Controller
    {
        [RBACAuthorize(Permission = "NewsAccess")]
        public ActionResult News()
        {
            ViewBag.Message = "Your news page.";
    
            return View();
        }
    }
    
  2. 按下Visual Studio的执行按钮,可以在浏览器上看到预设的首页内容,并且内容中多了一个名称为News的页面选单按钮。

  3. 使用预设的访客账号登入(ID:[email protected], PW:guest),点击页面选单按钮:News,这时因为系统里没有设定NewsAccess权限,所以会收到PermissionName not found.的错误讯息页面。

  4. 使用预设的管理账号登入(ID:[email protected], PW:admin),点击页面选单按钮:PermissionsAdmin进入权限管理页面,新增NewsAccess权限,并且让Guest群组拥有NewsAccess权限。

  5. 更换回预设的访客账号登入(ID:[email protected], PW:guest),点击页面选单按钮:News,因为现在Guest群组拥有NewsAccess权限,所以可以浏览News页面内容。

程序代码下载

程序代码下载:点此下载

时间: 2024-10-10 16:28:30

使用CLK.AspNet.Identity提供以角色为基础的访问控制(RBAC)的相关文章

[ASP.NET MVC] 使用CLK.AspNet.Identity提供以角色为基础的访问控制(RBAC)

[ASP.NET MVC] 使用CLK.AspNet.Identity提供以角色为基础的访问控制(RBAC) 程序代码下载 程序代码下载:点此下载 前言 ASP.NET Identity是微软所贡献的开源项目,用来提供ASP.NET的验证.授权机制.而在ASP.NET Identity的功能模块中:是采用Claims-Based验证来提供验证机制.并且实作Role-Based授权来提供授权机制.开发人员在系统内套用ASP.NET Identity后,就可以像下列范例一样定义用户属于哪个角色.哪个

从Microsoft.AspNet.Identity看微软推荐的一种MVC的分层架构

Microsoft.AspNet.Identity简介 Microsoft.AspNet.Identity是微软在MVC 5.0中新引入的一种membership框架,和之前ASP.NET传统的membership以及WebPage所带来的SimpleMembership(在MVC 4中使用)都有所不同. Microsoft.AspNet.Identity是符合微软开放Owin标准里面Security标准的一种实现.且在MVC 5中默认使用EntityFramework作为Microsoft.A

Asp.net Identity 系列之 怎样修改Microsoft.AspNet.Identity.EntityFramework.IdentityUser 的 Id 字段的数据类型

这篇博客我们来学习如何将AspNetUsers 表的Id 字段 的类型由nvarchar(128) 改为Int 并且子增长 1.为什么要修改 如果你运行过 Asp.net mvc 示例项目,你好会发现 AspNetUsers 表的Id是Nvarchar(128) 类型,值为GUID,不可否认使用GUID来做主键进行主外键关联会增加数据安全性(个人看法),但是非常不利于查询,可读性不够,因此我们尝试着去改为Int类型. 先看一下修改后的效果: 2.修改前分析 查看数据库结构我们知道要修改的表有这样

Microsoft.AspNet.Identity 自定义使用现有的表—登录实现

Microsoft.AspNet.Identity是微软新引入的一种membership框架,也是微软Owin标准的一个实现.Microsoft.AspNet.Identity.EntityFramework则是Microsoft.AspNet.Identity的数据提供实现.但是在使用此框架的时候存在一些问题,如果是全新的项目还可以使用它默认提供的表名,字段名等.但是如果是在一些老的数据库上应用这个框架就比较麻烦了.所以我们实现一个自己的Microsoft.AspNet.Identity.En

AspNet Identity and IoC Container Registration

https://github.com/trailmax/IoCIdentitySample TL;DR: Registration code for Autofac, for SimpleInjector, for Unity. Tony Mackay has an alternative walk-through of a very similar process but with Autofac Part 2: Sending Emails in Asp.Net Identity using

Microsoft.AspNet.Identity 2.0 用账号或者邮件作为登陆方式

创建一个默认的MVC4.0的项目工程,默认的登陆方式是邮件登陆,那么有没办法改为用账号登陆? 我们来看下默认的登陆Action [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) { if (!ModelState.IsValid) { return View(model); }// This doesn

Microsoft.AspNet.Identity.EntityFramework/IdentityDbContext.cs

using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; using System.Data.Common; using System.Data.Entity; using System.Data.Entity.Infrastructure; using System.Data.Entity.Infrastructure.Annotations; usin

Microsoft.AspNet.Identity 重置密码

原文:Microsoft.AspNet.Identity 重置密码 重置密码:先生成重置密码的Token,然后调用ResetPassword方法重置密码,密码要符合规则.. ApplicationUserManager UserManager => _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); string token = UserManager.Generat

基于角色的权限访问控制初步

基于角色的权限访问控制(Role-Based Access Control) 角色访问控制(RBAC)引入了role的概念,目的是为了隔离user(即动作主体,subject)与privilege(权限,表示对resource的一个操作,即operation+resource).role作为一个用户(user)与权限(privilege)的代理层,解耦了权限和用户的关系,所有的授权应该给予role而不是直接给user或 group.privilege是权限颗粒,由operation和resour