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

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

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 Ответ

3 голосов
/ 13 мая 2010

Нечто подобное может помочь вам в вашем пути. Хотя вы можете захотеть добавить некоторые дополнительные свойства в свой атрибут, чтобы позволить вам указывать параметр 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.

...