У меня есть определенная часть моего сайта, которая проверяет, может ли вошедший в систему пользователь иметь доступ к идентификатору записи (идентификатору отчета), и если так, он может просматривать содержимое на этой странице.Существуют различные типы пользователей / компаний, которые будут просматривать контент.
Каков наилучший способ написания пользовательского атрибута, который будет проверять, может ли пользователь получить доступ к идентификатору?Должен ли я передать строку запроса?Обратите внимание, что идентификатор будет получен из маршрута / URL.
Например, идентификатор отчета = 678. URL:
- / Report / 678 / Detail
- / Report /678 / Progress / Staged
- / Report / 678 / TaskManager / 78 /
- / Report / 678 / Участники
использование кода ниже
[ReportAuthorizationAttribute ())] //get query string yourself
[ReportAuthorizationAttribute (Request.Querystring["reportid"))] //this does not look possible to do???
// Код, который будет добавлен к базовому контроллеру для этой области
public class ReportAuthorizationAttribute : AuthorizeAttribute
{
/// <summary>
/// inject via Ninject - there must be a better way? Using service locator?
/// </summary>
[Inject]
public readonly IReportRepo _repo { get; set; }
[Inject]
public readonly IUserSession _user { get; set; }
private int _reportid;
public ReportAuthorizationAttribute()
: base()
{ //*Is this way the best way?*
_reportid= Int32.Parse(HttpContext.Current.Request.QueryString["reportid"]);
}
public ReportAuthorizationAttribute(params int reportid)
: base()
{
_reportid = reportid;
}
public ReportAuthorizationAttribute(params string reportid)
: base()
{
_reportid= Int32.Parse(reportid);
}
public bool AlwaysAllowLocalRequests = false;
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (httpContext == null)
throw new NoAccessException("httpContext is null");
if (!httpContext.User.Identity.IsAuthenticated)
throw new NoAccessException("unauthorized user");
var companyid = _user.GetCurrentUser().CompanyID;
if (AlwaysAllowLocalRequests && _repo.IsCompanyParticipantInReport(_reportid, companyid))
return true;
return false;
}
}