代码之家  ›  专栏  ›  技术社区  ›  Dylan Beattie

将操作参数绑定到ASP.NET MVC中的请求cookie-发生了什么?

  •  4
  • Dylan Beattie  · 技术社区  · 17 年前

    this post from Stephen Walther

    例如,此代码用于:

    public class MyController : Controller {
    
        // This should bind to Request.Cookies["userId"].Value
        public ActionResult Welcome(int userId) {
    
            WebUser wu = WebUser.Load(userId);
            ViewData["greeting"] = "Welcome, " + wu.Name;
            return(View());
        }
    }
    

    但是现在针对候选版本运行时,它抛出了一个异常,因为它找不到userId的值,即使userId肯定出现在请求cookie中。

    发行说明中是否涵盖了此更改?如果这是对框架的一个更改,那么现在是否有推荐的替代方法来以这种方式绑定cookie和服务器变量?

    编辑:感谢你们中迄今为止做出回应的人。我可能选择了一个糟糕的例子来证明这一点;我们的代码使用cookie实现各种形式的“方便”但非必要的持久性(记住搜索结果的顺序,诸如此类),因此这绝不是纯粹的身份验证问题。依赖用户cookie的安全影响已得到充分记录;我更感兴趣的是当前关于检索cookie值的灵活、易于测试的技术的建议。(我相信您会理解,上面的示例可能有安全隐患,但非常、非常容易测试!)

    3 回复  |  直到 17 年前
        1
  •  3
  •   Matt Mitchell    17 年前

    我不相信这些饼干已经被检查过了,我也不确定这是否是故意的。

    CookieContainer code from this post 类上的自定义authorize属性,如下所示:

    public class LoginRequiredAttribute : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            IAppCookies a = new AppCookies(new CookieContainer());
            return a.UserId != null; /* Better checks here */
        }
    }
    

    My AppCookies.cs只有一个这样的UserId方法(自动解析为int/null):

    public int? UserId
    {
        get { return _cookieContainer.GetValue<int?>("UserId"); }
        set { _cookieContainer.SetValue("UserId", value, DateTime.Now.AddDays(10)); }
    }
    

    然后确保您的web.config设置为指向您的登录页面,如下所示:

    <authentication mode="Forms">
    <forms loginUrl="~/Login"/>
    </authentication>
    

    这意味着在我的控制器中,要获取用户ID,我需要执行以下操作来检索我的cookie:

    [LoginRequiredAttribute]
    public class RandomController : Controller
    {
        BaseDataContext dbContext = new BaseDataContext();
        private readonly IAppCookies _cookies = new AppCookies(new CookieContainer());
    
        public ActionResult Index()
        {
            return View(new RandomViewData(dbContext, _cookies.UserId));
        }
    }
    
        2
  •  3
  •   Community Mohan Dere    6 年前

    我相信正是出于安全方面的考虑,他们才采取了以下行动:

    斯蒂芬·沃尔特帖子中的评论 ASP.NET MVC Tip 15 User Input in Sheep's Clothing ,尤其是他的评论 here

    @特洛伊-第一步是首先劝阻开发人员放弃这种思维方式第一步质数(并行)是为了消除这种情况下这种思路的可能性。

    更重要的一点仍然存在,我们可以做出这种改变(在讨论之后,我们可能会),但这并不意味着信任操作方法参数会突然变得安全。

    再加上如何从各种action builder类调用这些方法的复杂性。

    除了Stephen的帖子之外,我似乎找不到任何关于控制器行为的明确文档,所以我猜它是“悄悄删除”的。

        3
  •  0
  •   Dan Atkinson    17 年前

    除了显而易见的 security implications

    当然,您最好在操作上使用Authorize属性,指示在执行操作之前应该对用户进行身份验证。

    最后,我认为(希望)微软已经关闭了这个网站,因为这是一个相当大的安全问题。如果是这样的话,你应该考虑重写你的应用程序,以符合这一点。