Como usar o Autorizeattribute personalizado para controlador utilizando o valor do parâmetro?
-
26-09-2019 - |
Pergunta
Estou tentando garantir uma ação do controlador para impedir que um usuário acesse uma entidade à qual ele não tem acesso. Sou capaz de fazer isso com o código a seguir.
public ActionResult Entity(string entityCode)
{
if (CurrentUser.VerifyEntityPermission(entityCode))
{
//populate viewModel...
return View(viewModel);
}
return RedirectToAction("NoAccessToEntity", "Error");
}
Eu gostaria de poder adicionar um atributo à própria ação do controlador. Para validar o acesso à entidade, preciso ver qual valor foi passado para o controlador e a quais entidades a que o usuário tem acesso. Isso é possível?
[EntityAuthRequired]
public ActionResult Entity(string entityCode)
{
//populate viewModel...
return View(viewModel);
}
Solução
Algo assim pode ajudá -lo no seu caminho. Embora você queira adicionar algumas propriedades adicionais ao seu atributo para permitir que você especifique seu parâmetro EntityCode em cada ação, em vez de codificá-lo.
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();
}
}
Além disso, se o entityCode
não está no seu rotedata, você pode usar filterContext.RequestContext.HttpContext.Request
Para olhar para os dados postais.