何十年にもわたってさまざまな認証および承認技術を使用してきた私の現在のMVCアプリケーションは、次の方法論を使用しています。
クレームはすべての承認に使用されます。ユーザーには1つの役割が割り当てられます(複数の役割が可能ですが、これは必要ありません)。
一般的な方法と同様に、ClaimsAuthorize属性クラスが使用されます。ほとんどのコントローラーアクションはCRUDであるため、コードファーストデータベース生成には、すべてのコントローラーアクションを反復し、読み取り/編集/作成/削除の各コントローラーアクション属性のクレームタイプを作成するルーチンがあります。たとえば、
[ClaimsAuthorize("SomeController", "Edit")]
[HttpPost]
MVCビューで使用するために、基本コントローラークラスはビューバッグアイテムを提示します
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
// get user claims
var user = filterContext.HttpContext.User as System.Security.Claims.ClaimsPrincipal;
if (user != null)
{
// Get all user claims on this controller. In this controler base class, [this] still gets the descendant instance type, hence name
List<Claim> claims = user.Claims.Where(c => c.Type == this.GetType().Name).ToList();
// set Viewbag with default authorisations on this controller
ViewBag.ClaimRead = claims.Any(c => c.Value == "Read");
ViewBag.ClaimEdit = claims.Any(c => c.Value == "Edit");
ViewBag.ClaimCreate = claims.Any(c => c.Value == "Create");
ViewBag.ClaimDelete = claims.Any(c => c.Value == "Delete");
}
base.OnActionExecuting(filterContext);
}
ウェブサイトのメニューやその他のコントローラー以外のアクションについては、他にも申し立てがあります。たとえば、ユーザーが特定の通貨フィールドを表示できるかどうか。
bool UserHasSpecificClaim(string claimType, string claimValue)
{
// get user claims
var user = this.HttpContext.User as System.Security.Claims.ClaimsPrincipal;
if (user != null)
{
// Get the specific claim if any
return user.Claims.Any(c => c.Type == claimType && c.Value == claimValue);
}
return false;
}
public bool UserHasTradePricesReadClaim
{
get
{
return UserHasSpecificClaim("TradePrices", "Read");
}
}
では、役割はどこに収まるのでしょうか?
ロールを(デフォルトの)クレームのセットにリンクするテーブルがあります。ユーザー認証を設定する場合、デフォルトでは、ユーザーに役割のクレームを付与します。各ユーザーは、デフォルトよりも多いまたは少ないクレームを持つことができます。編集を簡単にするために、クレームリストはコントローラーおよびアクション(行)ごとに表示され、他のクレームがリストされます。ボタンは、Javascriptを少し使用してアクションのセットを選択し、クレームの選択に必要な「クリック」を最小限に抑えます。保存すると、ユーザーの要求が削除され、選択した要求がすべて追加されます。Webアプリケーションはクレームを1回だけロードするため、変更を行うと、この静的データ内でリロードを促す必要があります。
したがって、マネージャーは、各ロールにあるクレームと、ユーザーがロールに設定した後にユーザーが持つクレームとそれらのデフォルトクレームを選択できます。システムには少数のユーザーしかないため、このデータの管理は簡単です