[ASP.NET MVC] 使用CLK.AspNet.Identity提供依权限显示选单项目的功能

[ASP.NET MVC] 使用CLK.AspNet.Identity提供依权限显示选单项目的功能

CLK.AspNet.Identity

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

问题情景

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

问题情景01

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

问题情景02

解决方案

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

  1. 在系统里加入一个新的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();
        }
    }
    
  2. 编辑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>
    
  3. 完成上述程序程序开发工作之后,还需要进入系统,设定用户权力。在下面这个范例中,示范使用Permission管理页面,将权限开放给Admin群组使用。

    解决方案01

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

    解决方案02

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

    解决方案03

posted @ 2015-10-18 15:41  Clark159  阅读(1295)  评论(2编辑  收藏  举报