Использование Action Filters на MVC С# с использованием запроса String
Im, используя имя класса RightCheckerAttribute, чтобы проверить разрешение пользователя в приложении MVC3...
Таким образом, класс RightCheckerAttribute выглядит следующим образом:
public bool isAdmin { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpContextBase context = filterContext.HttpContext;
bool result = Convert.ToBoolean(context.Request.QueryString["isAdmin"].ToString());
if (isAdmin != result)
{
RouteValueDictionary redirecttargetDictionary = new RouteValueDictionary();
redirecttargetDictionary.Add("action", "NoPermission");
redirecttargetDictionary.Add("controller","Singer");
filterContext.Result = new RedirectToRouteResult(redirecttargetDictionary);
}
//base.OnActionExecuting(filterContext);
}
Итак, в методе i, применяющем это, есть голова как..
[RightChecker (isAdmin=true)]
Im Выполнение этого метода как это.
http://localhost:5576/Singer/DeleteSinger?isAdmin=true
Проблема в том, передаю ли я true или false... Я получил переменную result как false... И я получаю:
Исключение [Нулевые ссылки на объекты]...
Ответы
Ответ 1
Кажется, вы не передаете isAdmin=false
или isAdmin=true
в строке запроса. Меня устраивает. Однако вам потребуется обработать ситуацию, когда вы не передаете параметр querystring. Проверьте мою реализацию. Как упоминалось в разделе комментариев вопроса, он недостаточно защищен, чтобы передать это через строку запроса.
public class RightChecker : ActionFilterAttribute
{
public bool IsAdmin;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
bool result = false;
if (filterContext.HttpContext.Request.QueryString["isAdmin"] != null)
{
bool.TryParse(filterContext.HttpContext.Request.QueryString["isAdmin"].ToString(), out result);
}
if (IsAdmin != result)
{
//your implementation
}
}
}
Ваш метод действий
[RightChecker(IsAdmin=true)]
public ActionResult AttCheck()
{
return View();
}
Ответ 2
Проверить права на querystring не очень безопасно.
вы можете попробовать следующее:
[link] "Безопасность и" ссылка на действие?
но из-за изменений mvc 3 api некоторый код устарел в ActionIsAuthorized Method, вы можете исправить его самостоятельно, см. мой вопрос, заданный здесь [link] https://stackoverflow.com/questions/10545018/how-to-get-authorizationfilters-from-filterproviders
Ответ 3
Похоже, что context.Request.QueryString["isAdmin"].ToString()
вызывает NullReferenceException
.
Try
var param = context.Request.QueryString["isAdmin"] as string ?? "false";
var result = param == "true";
Ответ 4
Передайте это в свои ViewData, показанные ниже:
public ActionResult Test(bool testParam)
{
ViewData["isAdmin"] = testParam;
return View();
}