ASP.NET MVC でアプリのアクセス許可ベースの承認システムを使用しています。このために、カスタム認証属性を作成しました
public class MyAuthorizationAttribute : AuthorizeAttribute
{
string Roles {get; set;}
string Permission {get; set;}
}
ロールまたは特定のアクセス許可キーの両方でユーザーを認証できるように、次のようなアクションの注釈を付けます
public class UserController : Controller
{
[MyAuthorization(Roles="ADMIN", Permissions="USER_ADD")]
public ActionResult Add()
[MyAuthorization(Roles="ADMIN", Permissions="USER_EDIT")]
public ActionResult Edit()
[MyAuthorization(Roles="ADMIN", Permissions="USER_DELETE")]
public ActionResult Delete()
}
次に、 MyAuthorizationAttribute クラスの AuthorizeCore() メソッドを同様のロジック(疑似コード)でオーバーライドします
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if(user not authenticated)
return false;
if(user has any role of Roles)
return true;
if(user has any permission of Permissions)
return true;
return false;
}
ここまでは正常に動作しています。
ここで、特定のアクションの MyAuthorization 属性承認ロジックに基づいてアクション URL を返すビュー ページでアクション URL を動的に生成できるように、何らかの拡張メソッドが必要です。お気に入り
@Url.MyAuthorizedAction("Add", "User")
ユーザーが管理者ロールを持っているか、「USER_ADD」の権限 (アクションの属性で定義されている) を持っている場合は「User/Add」に URL を返し、それ以外の場合は空の文字列を返します。
しかし、インターネットで数日間検索した後、私はそれを理解できませんでした。:(
これまでのところ、この「セキュリティを意識した」アクションリンクしか見つかりませんでしたか? これは、失敗するまでアクションのすべてのアクション フィルターを実行することによって機能します。
それはいいことですが、MyAuthorizedAction() メソッドを呼び出すたびにすべてのアクション フィルターを実行するのはオーバーヘッドになると思います。また、私のバージョン(MVC 4および.NET 4.5)でも機能しませんでした
必要なのは、認証されたユーザーの役割、アクセス許可 (セッションに保存される) を、承認された役割と特定のアクションのアクセス許可に対してチェックすることだけです。次のようなもの(疑似コード)
MyAuthorizedAction(string actionName, string controllerName)
{
ActionObject action = SomeUnknownClass.getAction(actionName, controllerName)
MyAuthorizationAttribute attr = action.returnsAnnationAttributes()
if(user roles contains any in attr.Roles
or
user permissions contains any attr.Permissions)
{
return url to action
}
return empty string
}
アクション属性値を取得する解決策をかなり長い間探していますが、十分なリソースがまったく見つかりませんでした。適切なキーワードを見逃していませんか? :/
誰かが本当に大きな助けになる解決策を私に提供できれば. 解決策を事前にありがとう