文章出處

Intro

由于項目需要,需要在 基于 Asp.net mvc 的 Web 項目框架中做權限的控制,于是才有了這個權限控制組件。

項目基于 .NETStandard,同時支持 asp.net mvc(.NET faremwork4.5以上) 和 asp.net core 項目(asp.net 2.0以上),基于 ASP.NET MVC 和 ASP.NET Core 實現的對 Action 的訪問控制以及頁面元素的權限控制。

GetStarted

  1. Nuget Package https://www.nuget.org/packages/WeihanLi.AspNetMvc.AccessControlHelper/

    安裝權限控制組件 WeihanLi.AspNetMvc.AccessControlHelper

    asp.net:

    Install-Package WeihanLi.AspNetMvc.AccessControlHelper
    

    asp.net core:

    dotnet add package WeihanLi.AspNetMvc.AccessControlHelper
    
  2. 實現自己的權限控制顯示策略類

    • 實現頁面元素顯示策略接口 IControlAccessStrategy
    • 實現 Action 訪問顯示策略接口 IActionAccessStrategy

    示例代碼:

  3. 程序啟動時注冊自己的顯示策略

    • asp.net mvc

    可基于Autofac實現的依賴注入,在 autofac 的 Ioc Container中注冊顯示策略,并返回一個可以從Ioc Container中獲取對象的委托或者實現 IServiceProvider 接口的對象,參考:https://github.com/WeihanLi/AccessControlHelper/blob/master/samples/PowerControlDemo/Global.asax.cs#L23

    //autofac ContainerBuilder
    var builder = new ContainerBuilder();
    // etc...
    
    // register accesss control
    builder.RegisterType<ActionAccessStrategy>().As<IActionAccessStrategy>();
    builder.RegisterType<ControlAccessStrategy>().As<IControlAccessStrategy>();
    var container = builder.Build();
    // Important
    AccessControlHelper.RegisterAccessControlHelper<ActionAccessStrategy, ControlAccessStrategy>(type => container.Resolve(type));
    • asp.net core

    Startup 文件中注冊顯示策略,參考https://github.com/WeihanLi/AccessControlHelper/blob/master/samples/AccessControlDemo/Startup.cs

    // Configure
    app.UseAccessControlHelper();
    
    // ConfigureServices
    services.AddAccessControlHelper<ActionAccessStrategy, ControlAccessStrategy>();
  4. 控制 Action 的方法權限

    通過 AccessControlNoAccessControl Filter 來控制 Action 的訪問權限,如果Action上定義了 NoAccessControl 可以忽略上級定義的 AccessControl,另外可以設置 Action 對應的 AccessKey

    使用示例:

    [NoAccessControl]
    public IActionResult Index()
    {
        return View();
    }
    
    [AccessControl]
    public IActionResult About()
    {
        ViewData["Message"] = "Your application description page.";
    
        return View();
    }
    
    [AccessControl(AccessKey = "Contact")]
    public IActionResult Contact()
    {
        ViewData["Message"] = "Your contact page.";
    
        return View();
    }
  5. 控制頁面元素的顯示

    為了使用比較方便,建議在頁面上導入命名空間,具體方法如下,詳見 Samples:

    • asp.net mvc

      在 項目的 Views 目錄下的 web.config 文件中添加命名空間 WeihanLi.AspNetMvc.AccessControlHelper

      <system.web.webPages.razor>
          <pages pageBaseType="System.Web.Mvc.WebViewPage">
              <namespaces>
                  <add namespace="System.Web.Mvc" />
                  <add namespace="System.Web.Mvc.Ajax" />
                  <add namespace="System.Web.Mvc.Html" />
                  <add namespace="System.Web.Optimization"/>
                  <add namespace="System.Web.Routing" />
                  <add namespace="PowerControlDemo" />
                  <add namespace="WeihanLi.AspNetMvc.AccessControlHelper" /><!-- add WeihanLi.AspNetMvc.AccessControlHelper-->
              </namespaces>
          </pages>
      </system.web.webPages.razor>
    • asp.net core

      在 Views 目錄下的 _ViewImports.cshtml 中引用命名空間 WeihanLi.AspNetMvc.AccessControlHelper

      @using AccessControlDemo
      @using WeihanLi.AspNetMvc.AccessControlHelper// add WeihanLi.AspNetMvc.AccessControlHelper
      @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

    通過 HtmlHelper 擴展方法來實現權限控制

    • SparkContainer 使用

      @using(Html.SparkContainer("div",new { @class="container",custom-attribute = "abcd" }))
      {
          @Html.Raw("1234")
      }
      
      @using (Html.SparkContainer("span",new { @class = "custom_p111" }, "F7A17FF9-3371-4667-B78E-BD11691CA852"))
      {
          @:12344
      }

      沒有權限訪問就不會渲染到頁面上,有權限訪問的時候渲染得到的 Html 如下:

      <div class="container" custom-attribute="abcd">1234</div>
      
      <span class="custome_p111">12344</span>
    • SparkLink

      @Html.SparkLink("Learn about me &raquo;", "http://weihanli.xyz",new { @class = "btn btn-default" })

      有權限訪問時渲染出來的 html 如下:

      <a class="btn btn-default" href="http://weihanli.xyz">Learn about me »</a>
    • SparkButton

       @Html.SparkButton("12234", new { @class= "btn btn-primary" })

      有權限訪問時渲染出來的 html 如下:

      <button class="btn btn-primary" type="button">12234</button>

Contact

如果您在使用中遇到了問題,歡迎隨時與我聯系。

Contact me: weihanli@outlook.com


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()