标签:
1. 安全性:无趣但重要
永远都不要相信客户提供的任何数据。
举例:
2. 使用Authorize特性
Authorize控制器过滤器用于设置应用程序的访问部分,也可以用于全局操作过滤器使用。
如何禁用匿名访问,例如在Buy控制器上,添加Authorize特性
[Authorize] public ActionResult Buy(int id) { var album = GetAlbums().Single(a => a.AlbumId == id); //Charge the user and ship the album!!! return View(album); }
Authorize特性首先执行OnAuthorization方法,该方法是IAuthorizationFilter中定义的。源代码如下
IPrincipal user = httpContext.User; If(!user.Identity.IsAuthonticated){ return false; } if(_userSplit.Length > 0 && !_userSplit.Contains(user.Identity.Name, StringComparer.OrdinalIgnoreCase)){ return false; } if(_userSplit.Length > 0 && !_rolesSplit.Any(user.IsInRole)){ return false; } return true;
安全机制验证ASP.NET上下文httpContext.User中存储的身份信息。
Authoritize作为过滤器先于控制器操作执行,如果验证失败,返回HTTP401(未授权)的状态码。这个401状态码不友好,一般用HTTP302重定向到登录界面。
MVC5中的重定向设定:401到302重定向的转换过程由OWIN(Open Web Interface for .NET)中间件处理;基于Cookie的身份认证由CookieAuthencationHandler(包含在Microsoft.Owin.Cookies名称空间中)处理。
ASP.NET先前版本的处理:这个重定向由FormsAuthenticationModule 的OnLeave方法截获,重定向到Web.Config文件定义的登录界面,代码如下:
<authentication mode="Forms"> <forms loginUrl="~/Account/LogOn" timeout="2880"> </authentication>
但是,开放重定向功能容易成为被攻击的对象,攻击者可以注入恶意的URL将用户重定向到有害的网站,避免的方法接下章节将会介绍,本节不再叙述。
3. 使用全局过滤器保证应用程序的安全
对大部分网站来说,基本上整个应用程序都需要授权访问,默认授权和匿名访问极少数页面(如主页和相关页面),可以将AuthorizeAttribute配置为全局过滤器。
将以下代码添加到RegisterGlobalFilters(\App_Start\FilterConfig.cs文件中),将AuthorizeAttribute应用于应用程序的所有控制器当中。
public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new System.Web.Mvc.AuthorizeAttribute()); filters.Add(new HandleErrorAttribute()); }
应用实例(已完成上述操作):
[AllowAnoymous]
public ActionResult LogIn(String returnUrl) { ViewBag.ReturnRul = returnUrl; return View(); }
在对应用程序所有的Control设定全局过滤器后,在方法上添加AllowAnoymous特性,实现外部的匿名访问登录页面。需要注意的是,AllowAnoymous特性只对标准的AuthoriseAttribute特性有效,对于自定义的过滤器不一定有效(MVC5 允许用户自定义过滤器、全局过滤器只针对MVC控制器操作有效,不能保障Web Forms 和静态内容或其他ASP.NET处理程序,该内容的实现方法由 web.config文件中的authorization元素保证)。
标签:
原文地址:http://www.cnblogs.com/mahuanpeng/p/5426157.html