[解決済み] ASP.NET MVC 4 Custom Authorize Attribute with Permission Codes (ロールを使用しない)
2022-07-27 20:44:38
質問
MVC 4 アプリケーションで、ユーザーの権限レベル (ロールはなく、ユーザーに割り当てられた CRUD 操作レベルの権限レベルのみ) に基づいて、ビューへのアクセスを制御する必要があります。
例として、以下のAuthorizeUserは私のカスタム属性であり、私はこのようにそれを使用する必要があります。
[AuthorizeUser(AccessLevels="Read Invoice, Update Invoice")]
public ActionResult UpdateInvoice(int invoiceId)
{
// some code...
return View();
}
[AuthorizeUser(AccessLevels="Create Invoice")]
public ActionResult CreateNewInvoice()
{
// some code...
return View();
}
[AuthorizeUser(AccessLevels="Delete Invoice")]
public ActionResult DeleteInvoice(int invoiceId)
{
// some code...
return View();
}
このようにすることは可能でしょうか?
どのように解決するのですか?
以下のようにカスタム属性でできました。
[AuthorizeUser(AccessLevel = "Create")]
public ActionResult CreateNewInvoice()
{
//...
return View();
}
Custom Attributeクラスを以下のように設定します。
public class AuthorizeUserAttribute : AuthorizeAttribute
{
// Custom property
public string AccessLevel { get; set; }
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var isAuthorized = base.AuthorizeCore(httpContext);
if (!isAuthorized)
{
return false;
}
string privilegeLevels = string.Join("", GetUserRights(httpContext.User.Identity.Name.ToString())); // Call another method to get rights of the user from DB
return privilegeLevels.Contains(this.AccessLevel);
}
}
権限のないユーザーをリダイレクトするために、カスタムの
AuthorisationAttribute
をオーバーライドすることで
HandleUnauthorizedRequest
メソッドをオーバーライドします。
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary(
new
{
controller = "Error",
action = "Unauthorised"
})
);
}
関連
-
[解決済み] アンチフォージェリーの必須項目「__RequestVerificationToken」が存在しない ユーザー登録時のエラーについて
-
[解決済み] MVC-3から4へ変換されたアプリでSystem.Web.Optimizationへの参照を追加する方法
-
[解決済み】@Scripts.Render("~/bundles/jquery")を使用する理由)
-
[解決済み] ASP.NET 4.5がWebサーバーに登録されていない
-
[解決済み] 全ページ共通のデータをレイアウトに渡す
-
[解決済み] 偽造防止トークンはユーザー""のためのものですが、現在のユーザーは "username "です。
-
[解決済み] ASP.NET MVC 4のデバッグモードでバンドルとミニフィケーションを有効にする
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] アンチフォージェリーの必須項目「__RequestVerificationToken」が存在しない ユーザー登録時のエラーについて
-
[解決済み] MVC-3から4へ変換されたアプリでSystem.Web.Optimizationへの参照を追加する方法
-
[解決済み】@Scripts.Render("~/bundles/jquery")を使用する理由)
-
[解決済み] ASP.NET 4.5がWebサーバーに登録されていない
-
[解決済み] 全ページ共通のデータをレイアウトに渡す
-
[解決済み] 偽造防止トークンはユーザー""のためのものですが、現在のユーザーは "username "です。
-
[解決済み] ASP.NET MVC 4のデバッグモードでバンドルとミニフィケーションを有効にする