17

我使用类名 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);
    }

所以在我应用这个的方法中,头是..

[RightChecker (isAdmin=true)]

我正在执行这个方法。

http://localhost:5576/Singer/DeleteSinger?isAdmin=true

问题是我传递的是真还是假......我得到的结果变量为假......而且我得到:

异常[空对象引用]...

4

4 回答 4

19

看来您没有在查询字符串中传递isAdmin=falseor isAdmin=true。这个对我有用。但是,您需要处理未传递查询字符串参数的情况。检查我的实施。正如问题的评论部分所提到的,通过查询字符串传递它的安全性不够。

        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();
    }
于 2012-05-15T05:16:43.580 回答
1

从查询字符串检查权限并不是很安全。你可以试试这个:[链接] “安全意识”操作链接?

但由于 mvc 3 api 更改,ActionIsAuthorized Method 中的一些代码已过时,您可以自己修复它,请参阅我在这里提出的问题 [链接] https://stackoverflow.com/questions/10545018/how-to-get-authorizationfilters-from -filterproviders

于 2012-05-15T05:51:04.060 回答
0

似乎可能context.Request.QueryString["isAdmin"].ToString()导致NullReferenceException.

尝试

var param = context.Request.QueryString["isAdmin"] as string ?? "false";
var result = param == "true";
于 2012-05-15T04:49:47.693 回答
0

将其传递到您的 ViewData 中,如下所示:

public ActionResult Test(bool testParam)
{
   ViewData["isAdmin"] = testParam;
   return View();
}
于 2012-05-15T07:15:55.673 回答