https://github.com/weihanli/weihanli.web.extensions/tree/dev/src/weihanli.web.extensions/accesscontrolhelperに移動して
WeihanLi.Web.Extensions
プロジェクトのニーズにより、ASP.NET MVCベースのWebプロジェクトフレームワークで許可制御を制御する必要があるため、この許可制御コンポーネントが利用可能です。
このプロジェクトは.NetStandardに基づいており、ASP.NET MVC(.NET Faremwork 4.5以上)とASP.NETコアプロジェクト(ASP.NET 2.0以上)の両方をサポートし、ASP.NET MVCおよびASP.NETコアに基づいて、実装されたページ要素のActionとアクションの制御にアクセスします。
ASP.NETコアはさらにサポートしています。 ASP.NETコアは、TagHelperを使用してページ上の要素の許可アクセスを制御し、ミドルウェアを介した静的リソースへのアクセスもサポートできます。
nugetパッケージhttps://www.nuget.org/packages/weihanli.aspnetmvc.accesscontrolhelper/
許可制御コンポーネントWeihanLi.AspNetMvc.AccessControlHelperをインストールします
ASP.NET:
Install-Package WeihanLi.AspNetMvc.AccessControlHelperASP.NETコア:
dotnet add package WeihanLi.AspNetMvc.AccessControlHelper独自の許可制御ディスプレイポリシークラスを実装します
IControlAccessStrategyを実装しますAction Access Display Policy Interface IResourceAccessStrategyを実装しますサンプルコード:
ASP.NET MVC
ASP.NETコア
ResourceAccessStrategy
ControlAcsStrategy
プログラムが開始されたら、独自のディスプレイポリシーを登録します
AutoFAC実装に基づく依存関係注射を使用して、AutoFACのIOCコンテナに表示ポリシーを登録し、IOCコンテナからオブジェクトを取得したり、 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フィルターはAction許可を制御するために使用されます。 NoAccessControlアクションで定義されている場合、前のレベルで定義されたAccessControl無視できます。さらに、アクションに対応する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 ( ) ;
}ページ要素の表示を制御します
より便利な使用のために、ページに名前空間をインポートすることをお勧めします。特定の方法は次のとおりです。詳細については、サンプルを参照してください。
ASP.NET MVC
名前空間参照を追加します
NameSpaceを追加するWeihanLi.AspNetMvc.AccessControlHelperプロジェクトのビューディレクトリにweb.configファイルに
< 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>かみそりページで使用します
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コア
htmlhelper拡張機能
名前空間参照を追加します
名前のWeihanLi.AspNetMvc.AccessControlHelperを参照してください。
@using AccessControlDemo
@using WeihanLi . AspNetMvc . AccessControlHelper // add WeihanLi.AspNetMvc.AccessControlHelper
@addTagHelper * , Microsoft . AspNetCore . Mvc . TagHelpersかみそりページで使用し、上記と同じ方法で使用します
Taghelper
TagHelperリファレンスを追加します
参照WeihanLi.AspNetMvc.AccessControlHelper Taghelper in _viewimports.cshtml in the Views Directory
@using AccessControlDemo
@addTagHelper * , Microsoft . AspNetCore . Mvc . TagHelpers
@addTagHelper * , WeihanLi . AspNetMvc . AccessControlHelper // add WeihanLi.AspNetMvc.AccessControlHelper TagHelperかみそりページで使用します
許可制御を必要とする要素にasp-access追加します。 asp-accesss-keyを使用してAccess-Keyを構成する必要がある場合、例: <ul class="list-group" asp-access asp-access-key="12334">...</ul>
このようにして、許可がある場合、このulのコンテンツは出力されます。許可がない場合、それは出力されません。セキュリティ上の理由から、 asp-access-keyを構成すると、 asp-access-key削除され、ブラウザに出力されません。
使用に問題がある場合は、お気軽にご連絡ください。
私に連絡してください:[email protected]