私はいくつかのエンティティ(ドライバ)で動作するアクションを持つコントローラを持っています。また、各ドライバはIDプロファイルにリンクされています。多くのコントローラの多くのアクションでいくつかのコードを実装する方法
public async Task<ActionResult> Details(int? id)
{
if ((id == null))
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
DriverDetailVM model = mapper.Map<DriverDetailVM>(db.Drivers.Find(id));
if ((model == null))
{
return HttpNotFound();
}
return View(model);
}
public async Task<ActionResult> Edit(int? id = null, bool isNewUser = false)
{
/////////
}
ユーザーに「スーパー管理者」という役割がある場合、ユーザーは任意のid値を持つページにアクセスできます。ユーザーがロール "ドライバ"を持っている場合、id値が彼のプロフィールと同じである場合にのみアクセスする必要があります。私は、のActionFilterでそれを実装しよう:
public class DriverAccessActionFilterAttribute : ActionFilterAttribute
{
public string IdParamName { get; set; }
public int DriverID { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.User.IsInRole("Driver"))
{
if (filterContext.ActionParameters.ContainsKey(IdParamName))
{
var id = filterContext.ActionParameters[IdParamName] as Int32;
if (id != DriverID)
filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.Forbidden);
}
else
filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
else
base.OnActionExecuting(filterContext);
}
}
が、私はこのコードを使用しようとすると:
[DriverAccessActionFilter(DriverID = currentUser.DriverId, IdParamName = "id")]
public async Task<ActionResult> Details(int? id)
{
オブジェクト参照があるので、それは、コンパイルする必要はありません。非静的フィールド、メソッド、または プロパティに必要です。
それを実装する方法は?
私はプリンシパルについて考えて、ありがとうございます –
あなたは歓迎してからドライブを試みてください'ActionFilterAttribute'の代わりに' AuthorizationFilterAttribute'があります。 – Zeeshan