ASP.NET MVC 用 CLK.AspNet.Identity 解决依权限显示选单项目

CLK.AspNet.Identity

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

    开源地址:https://github.com/Clark159/CLK.AspNet.Identity

问题情景

开发人员在系统内套用CLK.AspNet.Identity后,就可以依照使用者的权限,来限制用户能够使用那些功能。当用户透过浏览器进入权限的功能页面时,就会收到HTTP的403状态代码,用来告知使用者没有权限进入该页面。

以提供更好的使用者体验角度来说,用户点击选单项目后,得到没有权限进入该页面的响应。这样的操作流程,很容易让用户失去耐心。为了提供更好的用户体验,系统应该依用户的权限来显示选单项目,只显示有权限可以进入使用的选单项目,用以减少用户操作错误的机会。

解决方案

在套用CLK.AspNet.Identity的系统里,可以使用HasPermission这个扩充方法,来提供依权限显示选单项目的功能。使用方法如下:

在系统里加入一个新的ProductController、ProductViews,并且依照下列范例程序,加入Method及对应的权限:ProductAddAccess、ProductRemoveAccess。

public class ProductController : Controller
{
    [RBACAuthorize(Permission = "ProductAddAccess")]
    public ActionResult Add()
    {
        ViewBag.Message = "Your product add page.";
        return View();
    }

    [RBACAuthorize(Permission = "ProductRemoveAccess")]
    public ActionResult Remove()
    {
        ViewBag.Message = "Your product remove page.";  
        return View();
    }
}

编辑Views\Shared_Layout.cshtml,并且依照下列范例,使用HasPermission这个扩充方法,来依照用户的权限显示选单项目。

<div class="col-md-12" style="background-color:#222">
    <div class="container">
        @if (User.HasPermission("ProductAddAccess"))
        {
            @Html.ActionLink("Product add", "Add", "Product", null, new { @class = "btn btn-primary" })
        }

        @if (User.HasPermission("ProductRemoveAccess"))
        {
            @Html.ActionLink("Product remove", "Remove", "Product", null, new { @class = "btn btn-primary" })
        }
    </div>
</div>

完成上述程序程序开发工作之后,还需要进入系统,设定用户权力。在下面这个范例中,示范使用Permission管理页面,将权限开放给Admin群组使用。

使用预设的管理账号登入(ID:admin@example.com, PW:admin)登入后,可以看到因为admin@example.com属于Admin群组、而Admin群组拥有ProductAddAccess权限,所以系统选单中可以看到Product add这个选单项目。

更换使用预设的访客账号登入(ID:guest@example.com, PW:guest)登入后,可以看到因为guest@example.com属于Guest群组、而Guest群组没有ProductAddAccess权限,所以系统选单中看不到Product add这个选单项目。

使用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() { ... }

}

权限属于哪个角色


使用者属于哪个角色

安装

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



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


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


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



变更角色的权限

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




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



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



变更使用者的角色

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




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



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



新增系统的权限

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

public class HomeController : Controller

{

[RBACAuthorize(Permission = "NewsAccess")]

public ActionResult News()

{

ViewBag.Message = "Your news page.";

return View();

}

}

按下Visual Studio的执行按钮,可以在浏览器上看到预设的首页内容,并且内容中多了一个名称为News的页面选单按钮。


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




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



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

时间: 2024-11-10 07:58:21

ASP.NET MVC 用 CLK.AspNet.Identity 解决依权限显示选单项目的相关文章

DynamicData for Asp.net Mvc留言本实例 上篇:准备工作及显示文章列表

下载及新建工程 下载地址:http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx 选那个 DynamicDataMVC.zip就行,如随版本变化,请大家举一反三. 本文环境为Visual Studio 2008/Sql Server 2005 建立一个Asp.net Mvc工程:DMvc 引用Microsoft.Web.DynamicData.Mvc.DLL,及系统组件System.ComponentModel.DataAnnota

《Pro ASP.NET MVC 3 Framework》学习笔记之十七【示例项目SportsStore】

接下来是关于SportsStore的后台管理功能,也就是通常的CRUD操作.首先添加一个AdminController,代码如下: View Code using System.Web.Mvc; using SportsStore.Domain.Abstract; namespace SportsStore.WebUI.Controllers { public class AdminController : Controller { private IProductRepository repo

ASP.NET MVC Music Store教程(1):概述和新项目

转自 http://firechun.blog.163.com/blog/static/3180452220110270937467/ 本文转自http://www.asp.net/mvc,由本人翻译整理. 1 月31日补充:打算在公司的新项目中使用MVC,因此想把这篇文章翻译过来,做为公司开发小组的参考资料.最初看到这篇文章时,作者是用MVC 2实现的,但现在已经是针对MVC 3写的教程了.原来担心微软新推出的产品总是不太令人放心,加上教程中使用了Razor语法,不想让开发小组成员因为学习太多

《Pro ASP.NET MVC 3 Framework》学习笔记之十三【示例项目SportsStore】

接着我们添加一个分页功能.修改ProductController,如下所示: public class ProductController : Controller {public int PageSize = 4;//后面会更改 private IProductsRepository repository;public ProductController(IProductsRepository productRepository) { repository = productRepositor

ASP.NET MVC图片上传,预览,显示,编辑以及删除

问题描述 分享最新教程:<><><> 解决方案 解决方案二:感谢分享!解决方案三:精神无价解决方案四: 解决方案五:谢谢楼主分享!解决方案六:楼主好人---解决方案七:楼主精神可嘉解决方案八:收藏了,暂时还在控制台输出的世界里解决方案九:该回复于2015-12-31 23:42:24被版主删除解决方案十:MVP确实不一样啊..解决方案十一:谢谢楼主分享解决方案十二:该回复于2016-02-28 23:37:11被版主删除解决方案十三:马克一下~~~~解决方案十四: 解决

【初学者指南】在ASP.NET MVC 5中创建GridView

介绍 在这篇文章中,我们将会学习如何在 ASP.NET MVC 中创建一个 gridview,就像 ASP.NET Web 表单中的 gridview 一样.服务器端和客户端有许多可用的第三方库,这些库能够提供所有必需的功能,如 Web 表格中的搜索.排序和分页等.是否包含这些功能,取决于应用的特殊需求,例如在客户端和服务器端提供搜索或其它功能的需求等. 可用的库 以下是一些可用的库和插件: Grid.Mvc MVCGrid.NET PagedList.MVC JQuery.Grid JQuer

给ASP.NET MVC及WebApi添加路由优先级

一.为什么需要路由优先级 大家都知道我们在Asp.Net MVC项目或WebApi项目中注册路由是没有优先级的,当项目比较大.或有多个区域.或多个Web项目.或采用插件式框架开发时,我们的路由注册很可能 不是写在一个文件中的,而是分散在很多不同项目的文件中,这样一来,路由的优先级的问题就突显出来了. 比如: App_Start/RouteConfig.cs中 routes.MapRoute(      name: "Default",      url: "{controll

BrnShop开源网上商城第二讲:ASP.NET MVC框架

原文:BrnShop开源网上商城第二讲:ASP.NET MVC框架 在团队设计BrnShop的web项目之初,我们碰到了两个问题,第一个是数据的复用和传递,第二个是大mvc框架和小mvc框架的选择.下面我依次来说明下.       首先是数据的复用和传递:对于BrnShop的每一次请求,程序都要分成好几个阶段执行,例如验证,执行动作方法等等,在各个阶段我们可能需要重复使用同一信息,而我们的愿景就是希望此信息只需获取一次,然后沿着流程管道一直流动,这样在后面的阶段中就可以直接使用,不用再重新获取了

艾伟_转载:ASP.NET MVC数据验证

关于ASP.NET MVC的验证,用起来很特别,因为MS的封装,使人理解起来很费解.也可能很多人都在Scott Guthrie等人写的一本<ASP.NET MVC 1.0>书中,见过NerdDinner项目中对Dinner对象修改和添加的时的数据验证.但有许多封装的地方,不知道是怎样的工作原理,今天研究了,拿出来给大家分享一下. 数据库还是上一篇blog中的库与表,同样的方法来创建news表的实体类,在自动生成的news这个实体类中,我们发现有一个特殊的分部方法: partial void O