[解決済み] ASP.NET CoreでカスタムのAuthorizeAttributeを作成する方法は?
質問
ASP.NET Coreでカスタム認可属性を作ろうとしています。 以前のバージョンでは
bool AuthorizeCore(HttpContextBase httpContext)
. しかし、これはもう
AuthorizeAttribute
.
AuthorizeAttributeをカスタムで作成する場合、現在どのような方法があるのでしょうか?
私が達成しようとしていること ヘッダー認証でセッションIDを受け取ります。そのIDから、特定のアクションが有効であるかどうかを知ることができます。
どのように解決するのですか?
ASP.Net Core チームが推奨するアプローチは、完全に文書化されている新しいポリシー設計を使用することです。
ここで
. 新しいアプローチの背後にある基本的な考え方は、新しい
[Authorize]
属性で指定します。
[Authorize( Policy = "YouNeedToBe18ToDoThis")]
ここで、ポリシーはアプリケーションの
Startup.cs
を実行し、あるコードブロック (例えば、年齢が 18 歳以上であることを主張するユーザを確保する) を実行します。
ポリシー設計はフレームワークへの素晴らしい追加機能であり、ASP.Net Security Core チームはその導入を称賛されるべきです。 とはいえ、すべてのケースに適しているわけではありません。 このアプローチの欠点は、特定のコントローラやアクションが特定のクレームタイプを必要とするという、最も一般的なニーズに対して便利なソリューションを提供できないことです。 アプリケーションに、個々の REST リソースに対する CRUD 操作を制御する何百もの個別の権限 ("CanCreateOrder", "CanReadOrder", "CanUpdateOrder", "CanDeleteOrder" 等) がある場合、新しいアプローチはポリシー名と請求名間の一対一のマッピングの反復が必要か (e.g., etc.) です。
options.AddPolicy("CanUpdateOrder", policy => policy.RequireClaim(MyClaimTypes.Permission, "CanUpdateOrder));
または、実行時にこれらの登録を行うコードを記述する(例えば、データベースからすべての請求タイプを読み込んで、ループ内で前述の呼び出しを実行する)。 大半の場合、この方法の問題は、不必要なオーバーヘッドであることです。
ASP.Net Core Securityチームは、独自のソリューションを作成しないことを推奨していますが、場合によっては、これが最も賢明な選択肢となる可能性もあります。
以下は
IAuthorizationFilter
で、指定したコントローラやアクションに対する要求事項を簡単に表現できます。
public class ClaimRequirementAttribute : TypeFilterAttribute
{
public ClaimRequirementAttribute(string claimType, string claimValue) : base(typeof(ClaimRequirementFilter))
{
Arguments = new object[] {new Claim(claimType, claimValue) };
}
}
public class ClaimRequirementFilter : IAuthorizationFilter
{
readonly Claim _claim;
public ClaimRequirementFilter(Claim claim)
{
_claim = claim;
}
public void OnAuthorization(AuthorizationFilterContext context)
{
var hasClaim = context.HttpContext.User.Claims.Any(c => c.Type == _claim.Type && c.Value == _claim.Value);
if (!hasClaim)
{
context.Result = new ForbidResult();
}
}
}
[Route("api/resource")]
public class MyController : Controller
{
[ClaimRequirement(MyClaimTypes.Permission, "CanReadResource")]
[HttpGet]
public IActionResult GetResource()
{
return Ok();
}
}
関連
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?
-
[解決済み] Microsoft Officeをインストールせずに、C#でExcel(.XLSおよび.XLSX)ファイルを作成するにはどうすればよいですか?
-
[解決済み] ASP.NET MVCでenumからドロップダウンリストを作成するにはどうすればよいですか?
-
[解決済み] ConfigureServices内からASP.NET Core DIでインスタンスを解決する
-
[解決済み】ASP.NET COREでクライアントのIPアドレスを取得する方法とは?
-
[解決済み】ASP.NET Core RC2 Web ApiからHTTP 500を返すには?
-
[解決済み】ASP.net Core WebAPIでCORSを有効にする方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み] 関数を終了するには?