Ответ 1
Да, вы можете достичь этого с помощью настраиваемого атрибута Authorize:
public class MyAuthorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var authorized = base.AuthorizeCore(httpContext);
if (!authorized)
{
return false;
}
var rd = httpContext.Request.RequestContext.RouteData;
var id = rd.Values["id"];
var userName = httpContext.User.Identity.Name;
Submission submission = unit.SubmissionRepository.GetByID(id);
User user = unit.UserRepository.GetByUsername(userName);
return submission.UserID == user.UserID;
}
}
а затем:
[MyAuthorize]
public ActionResult Edit(int id)
{
// Carry out method
}
и предположим, что вам нужно подавать этот экземпляр представления, который мы ввели в пользовательский атрибут в качестве параметра действия, чтобы не ударить по базе данных еще раз, вы могли бы сделать следующее:
public class MyAuthorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var authorized = base.AuthorizeCore(httpContext);
if (!authorized)
{
return false;
}
var rd = httpContext.Request.RequestContext.RouteData;
var id = rd.Values["id"];
var userName = httpContext.User.Identity.Name;
Submission submission = unit.SubmissionRepository.GetByID(id);
User user = unit.UserRepository.GetByUsername(userName);
rd.Values["model"] = submission;
return submission.UserID == user.UserID;
}
}
а затем:
[MyAuthorize]
public ActionResult Edit(Submission model)
{
// Carry out method
}