ASP.Net MVC3 アプリケーションの読み取り専用ユーザーを作成するタスクがあります。つまり、ログインしてすべてのデータを表示できますが、データを更新することはできません。
次のような多くの認証記事/フレームワークを読みました:セキュアな ASP.NET MVC アプリケーションの実装、またはFluent Security Configuration、またはASP.Net MVC でのアクション フィルターの作成(およびその他のいくつかについては、既にリンクを失っています) .
ドメイン/アプリケーションへの大幅な変更を必要とするほとんどのアプローチの問題。そして、この機能を実装するのに1 日しかありません。
コントローラーごとに平均 4 つのアクション (主に CRUD 操作) を持つ約 100 のコントローラーがあり、それらのすべてを実行することは問題外です。また、新しいコードに属性を付けることを忘れがちです - バグが発生します。
これまでのところ、すべての POST ベースのアクションと、読み取り専用ユーザーの「作成」と呼ばれるコントローラー アクションを拒否するグローバル フィルターを考え出しました。
public class ReadOnlyFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{
var currentUser = HttpContext.Current.User;
if (currentUser == null || !currentUser.Identity.IsAuthenticated)
return; // user is not logged in yet
if (!currentUser.IsInRole("Readonly"))
return; // user is not read-only. Nothing to see here, move on!
// Presume User is read-only from now on.
// if action is of type post - deny
if (filterContext.HttpContext.Request.HttpMethod.ToUpper() == "POST")
{
filterContext.HttpContext.Response.Redirect("~/ReadOnlyAccess");
}
// if action is "Create" - deny access
if (filterContext.ActionDescriptor.ActionName == "Create")
{
filterContext.HttpContext.Response.Redirect("~/ReadOnlyAccess");
}
// if action is edit - check if Details action exits -> redirect to it.
//TODO get this done ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
return;
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
// blah! have to have this here for IActionFilter
}
}
次に、パスワード/メールの変更などのポスト アクション用の属性 [AllowReadOnlyUser] を作成し、フィルターでそのアクションを許可する予定です。
この種のことを行うためのより良い方法があるのだろうか?
更新: アプリケーションは一般消費用ではありません。企業の世界では、人、資産、その他の退屈なデータを追跡するために使用されます。
更新 2 : このタスクは終了したようです。始めたように、コントローラーとしてそれを行いました。完全なコードといくつかの説明は、私のブログで見ることができます。