ASP.Net 使用Area遇到的HomeController歧义问题

当我们的Area区域有一个HomeController控制器,根目录也有一个HomeController控制器的时候,我们访问主页会出现如下问题: 出现这个问题的原因是因为路由系统进行匹配的时候出现了Controller同名的歧义。 当Area被注册的时候,Area中定义的路由被限制了只寻找 Area 中的Controller,所以我们请求 /Admin/Home/Index 时能正常得到 MvcApplication1.Areas.Admin.Controllers 命名空间的 HomeController。然而我们在RouteConfig.cs文件的RegisterRoutes方法中定义的路由并没有类似的限制。 为了解决这个问题,我们需要在RouteConfig.cs文件中定义的路由中加上对应的 namespaces 参数。RouteConfig.cs 中修改后的路由如下: 1 2 3 4 5 6 7 8 9 10 public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, namespaces: new[] { "你根目录项目的命名空间.Controllers" } ); } 添加了 namespaces 参数后,路由系统在对这个路由进行匹配时,优先匹配指定命名空间的controller,如果匹配到则即刻停止查找,如果在指定的命名空间下没有匹配到对应的controller,再按照一般的方式进行匹配。 生成Area URL的连接 关于Area的URL链接生成,可以分为这么三种情况:第一种是在当前Area生成指向当前Area的链接;第二种是生成指向其他Area的链接;第三种是在某个Area中生成指向根目录的链接。下面是这三种情况生成链接的方法,使用的路由定义是系统默认的。 如果要在Area中生成当前Area的URL链接,直接用下面的方法就行: 1 @Html.ActionLink("Click me", "About") 它根据当前所在的Area和Controller会生成如下Html代码: 1 <a href="/Admin/Home/About">Click me</a> 如果要生成其他Area的URL链接,则需要在Html.

C# 泛型类型参数与约束

.NET 支持的泛型约束有以下五种: where T : struct | T必须是一个结构类型 where T : class T必须是一个类(class)类型 where T : new() | T必须要有一个无参构造函数 where T : NameOfBaseClass | T必须继承名为NameOfBaseClass的类 where T : NameOfInterface | T必须实现名为NameOfInterface的接口

ASP.Net MVC AJax辅助方法

Ajax的ActionLink方法 在Razor视图中,Ajax辅助方法可以通过Ajax属性访问,例如ActionLink方法可以创建一个具有异步行为的锚标签。 假如为Music Store创建一个“Daily Deal”链接,这个锚标签点击之后是在当页显示折扣专辑的详细信息,而不是 在一个新的页面显示。 那么我们可以这样写: 1 2 3 4 5 6 7 8 9 <div id="dailydeal> @Ajax.ActionLink("点击这里获得折扣信息", "Daily Deal", new AjaxOptions{ UpdateTargetId="dailydeal", InsertionMode=InsertionMode.Replace, HttpMethod="GET" }) </div> 第一个参数指定了链接文本,第二个参数指定了要异步调用的方法名称,第三个参数指定了发送请求和处理服务器 返回结果的方式。在这个示例当中,AjaxOption参数的选项指定了要使用来自服务器的响应元素替换id值为“dailydeal” 元素,为了得到服务器的响应,需要在控制器HomeController添加一个DailyDeal操作。 1 2 3 4 5 6 7 8 9 10 11 12 public ActionResult DailyDeal() { var albums = GetDailyDeal(); return PartialView("_DailyDeal",albums); } private Album GetDailyDeal() { return storeDB.Albums .OrderBy(a => a.Price) .First(); } Ajax操作链接的目标操作的返回值是纯文本或者HTML,在这个示例当中将会通过渲染一个部分视图来返回HTML。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <p> <img alt = "@Model.

ASP.Net MVC 重复提交

威胁概述 ASP.Net模型绑定通过重复提交成为了另外一种攻击媒介,例如: 我们有一个允许用户提交评价意见的商店商品页面: 1 2 3 4 5 6 7 8 public class Review{ public int ReviewID {get;set;} public int ProductID {get;set;} public Product Product {get;set;} public string Name {get;set;} public string Comment {get;set;} public bool Approved {get;set;} } 我们想向用户展示一个简单的表单,其中只包含字段Name和Comment: Name:@Html.TextBox(“Name”) Comment:@Html.TextBox(“Comment”) 我们不希望用户自己能够审核通过自己的评论,然而有大量Web工具可以恶意的向表单添加"Approved=true"。 然而模型绑定器并不知道提交的表单包含哪些字段,并且还会将Approved属性设置为true。 更糟糕的是Review类当中还有一个Product属性,因此还可能会更改掉Product.Price的字段值,这样可能会改变表中的一些值,这些值的修改最终超出了用户的权限。 防范 使用Bind特性防御重复提交攻击 Bind特性可用于控制器也可以用户控制器操作参数当中,可以白名单来指定允许绑定的字段,例如: [Bind(Include=“Name,Comment”)] 也可以使用黑名单,例如: [Bind(Exclute=“ReviewID,ProductID,Product,Approved”)] 诚然使用白名单的方法更加简单安全。

ASP.Net MVC CSRF跨站请求伪造 防范

CSRF跨站请求伪造 什么是混淆代理? 引用自Wikipedia的概念: 混淆代理是一个计算机程序,它被其他部分程序无辜地愚弄,以至于错误地使用自己的权限。它是特权扩大的一个具体类型。 在此类情形当中,代理就是浏览器,它受到了愚弄以至于误用其权限,将用户呈献给远程 网站。 本质很简单,CSRF是利用浏览器存储在本地的A站点cookie,在伪造的B站点中伪造请求, 再由浏览器打开新站点并且利用伪造的请求,读取A站点cookie,从而达到目的。 如何防止CSRF? 令牌验证 使用@Html.AntiForgeryToken辅助方法将会产生一个加密值作为隐藏的输入元素。 该值将与作为会话cookie存储在用户浏览器中的另外一个值相匹配,在提交表单 时,ActionFilter就回验证这两个值是否匹配。 幂等的GET请求 如果一个操作是幂等的,就可以重复执行多次而不改变执行结果,一般来说仅通过 使用POST请求修改数据库或者网站上的内容,就可以有效地防御全部CSRF攻击。 HttpReferrer验证
Built with Hugo
主题 StackJimmy 设计