在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值的灵活,易于测试的技术的建议更感兴趣。 (我相信你可以欣赏,上面的例子可能有安全隐患,但非常非常容易测试!)答案 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属性,这表明在执行操作之前应该对用户进行身份验证。
在一天结束时,我认为(希望)微软已经关闭了它,因为这是一个相当大的安全问题。如果是这种情况,您应该考虑重写您的应用程序以符合此要求。