【问题标题】:Binding action parameters to request cookies in ASP.NET MVC - what happened?在 ASP.NET MVC 中绑定操作参数以请求 cookie - 发生了什么?
【发布时间】:2009-03-05 09:19:59
【问题描述】:

在 ASP.NET MVC 的几个早期预览版中,控制器方法的参数将通过检查查询字符串、表单、cookie 和服务器变量集合来解析,如 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 值的灵活、易于测试的技术的建议更感兴趣。 (我相信你会明白,上面的例子可能有安全隐患,但是非常非常容易测试!)

【问题讨论】:

  • 你能发布你的路由表设置吗?
  • 在 ASP.NET 中,如果您执行 'Request["blah"]',它会查看查询字符串、表单发布、cookie,我认为是服务器变量 (eek)。 如果的意图是转移到查询字符串/表单发布以获取更多“预期”数据,那么我完全赞成......虽然真的只是一个猜测:)跨度>
  • 查看我的帖子,了解“用于检索 cookie 值的灵活、易于测试的技术”

标签: asp.net-mvc


【解决方案1】:

我相信是安全隐患说服他们把这些东西拿出来:

Stephen Walther 的帖子 ASP.NET MVC Tip 15 中的 cmets,导致 Phil Haack 的帖子 User Input in Sheep's Clothing,尤其是他的评论 here

@Troy - 第一步是首先劝阻开发人员放弃这种思路。 ;) 第一步素数(并行)是我们在这种情况下消除这种思路的可能性。

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

再加上从各种动作构建器类中调用这些方法的复杂性。

除了 Stephen 的帖子之外,我似乎无法以一种或另一种方式找到任何关于控制器行为如此的明确文档,所以我猜它是“悄悄地放弃了”。

【讨论】:

    【解决方案2】:

    我认为不再检查 cookie,我不确定这是不是故意的。

    在我最近编写的针对 RC 的应用程序中,我使用了 CookieContainer code from this post 和自定义授权属性,如下所示:

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

    我的 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>
    

    这意味着在我的控制器中获取 UserId 我需要执行类似的操作来检索我的 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));
        }
    }
    

    【讨论】:

      【解决方案3】:

      除了显而易见的security implications,为什么还要在路由中传递cookie?

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

      归根结底,我认为(希望)微软已经关闭了这个,因为这是一个相当大的安全问题。如果是这种情况,您应该考虑重写您的应用程序以符合此要求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-10
        • 2010-09-06
        • 2018-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多