Как использовать Custom AuthorizeAttribute для контроллера, использующего значение параметра?

Я пытаюсь обезопасить действие контроллера, чтобы предотвратить доступ пользователя к сущности, к которой у него нет доступа. Я могу сделать это с помощью следующего кода.

public ActionResult Entity(string entityCode)
{
    if (CurrentUser.VerifyEntityPermission(entityCode))
    {
        //populate viewModel...
        return View(viewModel);
    }
    return RedirectToAction("NoAccessToEntity", "Error");
}

Я хотел бы иметь возможность добавить атрибут для самого действия контроллера. Чтобы проверить доступ к объекту, мне нужно посмотреть, какое значение было передано контроллеру и к каким объектам пользователь имеет доступ. Это возможно?

[EntityAuthRequired]
public ActionResult Entity(string entityCode)
{
        //populate viewModel...
        return View(viewModel);
}

1 ответ

Решение

Нечто подобное может помочь вам на вашем пути. Хотя вы можете захотеть добавить некоторые дополнительные свойства к своему атрибуту, чтобы вы могли указывать свой параметр entityCode для каждого действия, а не жестко его кодировать.

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();            
    }
}

Кроме того, если entityCode нет в вашем RouteData, вы можете использовать filterContext.RequestContext.HttpContext.Request смотреть на данные POST.

Другие вопросы по тегам