Moved to https://github.com/WeihanLi/WeihanLi.Web.Extensions/tree/dev/src/WeihanLi.Web.Extensions/AccessControlHelper, please use
WeihanLi.Web.Extensionsinstead
由於項目需要,需要在基於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的訪問控制以及頁面元素的權限控制。
asp.net core 支持的更多一些,asp.net core 可以使用TagHelper 來控制頁面上元素的權限訪問,同時支持通過中間件也可以實現對靜態資源的訪問。
Nuget Package https://www.nuget.org/packages/WeihanLi.AspNetMvc.AccessControlHelper/
安裝權限控制組件WeihanLi.AspNetMvc.AccessControlHelper
asp.net:
Install-Package WeihanLi.AspNetMvc.AccessControlHelperasp.net core:
dotnet add package WeihanLi.AspNetMvc.AccessControlHelper實現自己的權限控制顯示策略類
IControlAccessStrategyAction訪問顯示策略接口IResourceAccessStrategy示例代碼:
ASP.NET Mvc
ASP.NET Core
ResourceAccessStrategy
ControlAccessStrategy
程序啟動時註冊自己的顯示策略
可基於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 < ResourceAccessStrategy > ( ) . As < IResourceAccessStrategy > ( ) ;
builder . RegisterType < ControlAccessStrategy > ( ) . As < IControlAccessStrategy > ( ) ;
var container = builder . Build ( ) ;
// Important
AccessControlHelper . RegisterAccessControlHelper < ActionAccessStrategy , ControlAccessStrategy > ( type => container . Resolve ( type ) ) ;在Startup文件中註冊顯示策略,參考https://github.com/WeihanLi/AccessControlHelper/blob/master/samples/AccessControlDemo/Startup.cs
// ConfigureServices
services . AddAccessControlHelper < ResourceAccessStrategy , ControlAccessStrategy > ( ) ;
// 自己注册服务,如果只用到资源访问,比如只有 API 可以只注册 IResourceAccessStrategy,反之如果只用到视图上的权限控制可以只注册 IControlAccessStrategy
//services.TryAddScoped<IResourceAccessStrategy, ActionAccessStrategy>();
//services.TryAddSingleton<IControlAccessStrategy, ControlAccessStrategy>();
//services.AddAccessControlHelper();
// 自定义服务生命周期
// services.AddAccessControlHelper<ActionAccessStrategy, ControlAccessStrategy>(ServiceLifetime.Scoped, ServiceLifetime.Singleton);
// asp.net core 【推荐用法】
services . AddAccessControlHelper ( )
. AddResourceAccessStrategy < ResourceAccessStrategy > ( ServiceLifetime . Scoped )
. AddControlAccessStrategy < ControlAccessStrategy > ( )
;
// Configure 中间件,可选,当你需要一个全局的 access control 时使用(会忽略控制器上的 AllowAnonymous)
// app.UseAccessControlHelper(); // use this only when you want to have a global access control especially for static files控制Action的方法權限
通過AccessControl和NoAccessControl 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 ( ) ;
}在asp.net core 中你也可以設置Policy和直接使用[AccessControl]方法一致
// [Authorize(AccessControlHelperConstants.PolicyName)]
[ Authorize ( "AccessControl" ) ]
public IActionResult Contact ( )
{
ViewData [ "Message" ] = "Your contact page." ;
return View ( ) ;
}控制頁面元素的顯示
為了使用比較方便,建議在頁面上導入命名空間,具體方法如下,詳見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>在Razor 頁面上使用
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 »" , "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 >asp.net core
HtmlHelper 擴展
添加命名空間引用
在Views 目錄下的_ViewImports.cshtml中引用命名空間WeihanLi.AspNetMvc.AccessControlHelper
@using AccessControlDemo
@using WeihanLi . AspNetMvc . AccessControlHelper // add WeihanLi.AspNetMvc.AccessControlHelper
@addTagHelper * , Microsoft . AspNetCore . Mvc . TagHelpers在Razor 頁面上使用,使用方法與上面的使用方式一樣
TagHelper
添加TagHelper 引用
在Views 目錄下的_ViewImports.cshtml中引用WeihanLi.AspNetMvc.AccessControlHelper TagHelper
@using AccessControlDemo
@addTagHelper * , Microsoft . AspNetCore . Mvc . TagHelpers
@addTagHelper * , WeihanLi . AspNetMvc . AccessControlHelper // add WeihanLi.AspNetMvc.AccessControlHelper TagHelper在Razor 頁面上使用
在需要權限控制的元素上增加asp- asp-access即可,如果需要配置access-key 通過asp- asp-accesss-key來配置,示例: <ul class="list-group" asp-access asp-access-key="12334">...</ul>
這樣有權限的時候就會輸出這個ul的內容,如果沒有權限就不會輸出,而且出於安全考慮,如果有配置asp-access-key的話也會把asp-access-key給移除,不會輸出到瀏覽器中
如果您在使用中遇到了問題,歡迎隨時與我聯繫。
Contact me: [email protected]