Come usare personalizzato AuthorizeAttribute per il controller utilizzando il valore del parametro?
-
26-09-2019 - |
Domanda
Sto cercando di assicurarsi un azione di controllo per evitare che un utente di accedere un'entità che non hanno accesso. Sono in grado di fare questo con il seguente codice.
public ActionResult Entity(string entityCode)
{
if (CurrentUser.VerifyEntityPermission(entityCode))
{
//populate viewModel...
return View(viewModel);
}
return RedirectToAction("NoAccessToEntity", "Error");
}
Mi piacerebbe essere in grado di aggiungere un attributo al azione del controller stesso. Al fine di convalidare l'accesso al soggetto, ho bisogno di vedere quale valore è stato passato al controller e quali entità che l'utente ha accesso. È possibile?
[EntityAuthRequired]
public ActionResult Entity(string entityCode)
{
//populate viewModel...
return View(viewModel);
}
Soluzione
Una cosa del genere potrebbe aiutare nel vostro cammino. Anche se si consiglia di aggiungere alcune proprietà aggiuntive per l'attributo per consentire di specificare il parametro entitycode su ogni azione, piuttosto che hard-code esso.
public class EntityAuthRequired : FilterAttribute, IAuthorizationFilter
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
//Make sure that this is not NULL before assigning value as string...
var entityCode = filterContext.RouteData.Values["entityCode"] as string;
// do your logic...
if (!allowed)
filterContext.Result = new HttpUnauthorizedResult();
}
}
Inoltre, se il entityCode
non è nel vostro RouteData, è possibile utilizzare filterContext.RequestContext.HttpContext.Request
a guardare i dati POST.