绑定动作参数以在ASP.NET MVC中请求cookie - 发生了什么?

时间:2009-02-23 12:27:43

标签: asp.net-mvc

在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值的灵活,易于测试的技术的建议更感兴趣。 (我相信你可以欣赏,上面的例子可能有安全隐患,但非常非常容易测试!)

3 个答案:

答案 0 :(得分:3)

我不相信饼干会被检查,我不确定它是否是故意的。

在我最近写的一个针对RC的应用程序中,我使用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 */
    }
}

我的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));
    }
}

答案 1 :(得分:3)

我认为这是安全问题,说服他们把这些拿出来:

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

  

@Troy - 第一步是首先劝阻开发者不要这样思考。 ;)第一步(并行)是我们在这种情况下消除这种思路的可能性。

     

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

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

我似乎无法找到任何明确的文档,关于控制器的行为与Stephen的帖子不同,所以我猜它是“悄然放弃”。

答案 2 :(得分:0)

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

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

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