成员资格、授权和安全性(一)

1.  安全性:无趣但重要

  永远都不要相信客户提供的任何数据。

  举例:

  • 对用户数据的数据进行编码,如果作为特性值显示,进行HTML编码;如用于JavaScript代码段,进行JavasCript编码;也可进行多层的编码,如HTML页面的JavaScript编码;
  • 对于网站,需要考虑哪些页面允许匿名访问,哪些页面需要认证访问;
  • 在不需要通过客户脚本(大部分情况下)访问Cookie时,使用HTTP-only cookie;
  • 外部输入的内容包括:显式表单、URL查询字符串、影藏表单域、Ajax请求以及外部服务结果;
  • 建议使用AntiXSS编码器(ASP.NET4.5以后版本自带的MS Web Protection Library的一个组件)

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元素保证)。

posted @ 2016-04-24 12:50  一夜泪水催人醉  阅读(407)  评论(0编辑  收藏  举报