ASP.NET Web API 可很是方便地建立基于 HTTP 的 Services,这些服务能够很是方便地被几乎任何形式的平台和客户端(如浏览器、Windows客户端、Android设备、IOS等)所访问,它可根据请求类型自动提供 JSON、XML 等类型的响应内容。在移动互联网逐渐成为主流的背景下,经过 Web API 对外发布基于标准、通用 HTTP 协议的服务来交换数据无疑具备很是大的优点和吸引力。本文将主要围绕 ASP.NET Web API 的安全性进行讨论。 html
1、Forms Authenticationweb
Forms 认证基于凭据(Ticket)机制,凭据在登陆时建立,一般会写入到 cookie 中。Forms 认证可应用在任何类型的ASP.NET 应用程序中,例如:WebForms,MVC,甚至 Web API等。默认的配置是 <authentication mode="None" />,所以为了使用Forms Authentication,一般须要在配置文件中进行配置。数据库
尽管 Forms 认证是 Web 应用程序的首选认证方式,但从 Web API 的安全性来讲,其实它并非一个理想的解决方案,对于非浏览器的客户端来讲,作个比喻,就像是穿西装戴斗笠般不搭调。api
最大的问题是在ASP.NET Web API中使用 Forms 认证方式的时候,并不会返回一个 302 代码(注:302 表示重定向,Web 应用程序中会被自动导航至设定的登陆页面地址),在 Web API 中使用 Forms 认证方式可参考以下代码:浏览器
1)在 WebApiConfig 文件中修改默认的代码以下:缓存
2)修改 MVC 的 FilterConfig 默认代码以下:安全
经过上述设置,对非受权的资源进行访问时将返回一个 401 代码(注:401 表示未经受权的请求),这和在 MVC 中非受权的请求返回到登陆页面的含义是同样的。服务器
有童鞋可能会问,为何不能重定向到登陆页面呢?其实真正的问题是 Forms 认证自己,它的原理决定了它是面向 Web 应用程序的,它有 Cookie 和重定向等的支持,而 ASP.NET Web API 倒是无状态的 RESTful 服务,这天然是不适合的。cookie
说到这里,休息一下,温习下 HTTP 响应的状态代码。mvc
HTTP 响应的状态代码为三位数字的编号,其中第 1 位定义了状态代码的类别:1 开头的表明信息类、2 开头的表明操做成功类、3 开头的表明重定向类、4 开头的表明客户端一侧的请求错误类、5 开头的表明服务器端一侧的错误类。
常见的状态代码以下:
2、身份(Identify)管理
一、认证(Authentication)和受权(Authorization)
1)认证的方式
身份认证的方式主要有以下三个方面:
典型的身份认证方式能够为上述的其中一种,其中第一种使用最为广泛,若是一个应用程序须要考虑更高的安全性,须要至少使用上述列表中的两种身份认证方式。例如银行卡,自己就属于第二种认证,但在ATM上取钱时每每还须要密码,这又使用了第一种认证方式。
2)基本角色的安全
在企业级的应用中,基于角色的安全是最多见的安全模型。在.NET Framework中提供了 Identify 对象,一个 Identify 对象表明了某个用户,最重要就是这两个接口:IIdentity 和 IPrincipal,这两个接口提供了基于角色的访问控制,其中 IIdentify 表明用户的身份标识,IPrincipal 表明用户关联的身份和角色。IPrincipal 有一个 Identity 属性和 IsInRole(string) 的方法,该方法判断当前用户是否属于某个角色。
在 .NET 中,每一个线程都有一个类型为 IPrincipal 的 CurrentPrincipal 属性。一般,在身份认证经过后须要建立一个 Principal 对象并赋予主线程的 CurrentPrincipal 属性,任何新建立的线程会自动建立一样的 Principal 对象。其实在.NET Framework中已经实现了两种类型的 Principal。
固然,你也能够本身实现符合自身要求的 Identity 和 Principal。例如在CSLA.NET中就实现了一个自定义的 Identity 和 Principal,能够设置 Serialized 特性,该 Principal 对象能够经过服务从客户端传到服务器端进行身份的认证和受权处理,以知足其 N-Tier 部署下进行身份认证和受权的须要,经过继承,甚至还能够新增必要的属性,很是方便。
3)基本声明(Claims)的安全
典型的基于声明(Claims)的 Identity 以下:
和前面提到的安全模型相比,在基于声明的安全模型中,声明的值必须来自于应用程序所信任的某个实体或机构(一般用户是/不是什么经过第三方验证,能够/不能够作什么由应用程序自身肯定)。
基于声明(Claims)的安全模型每每更加贴近现实生活,能够简化某单个应用程序的身份验证逻辑,由于这些应用程序不用再重复提供诸如建立帐户、密码、密码重置等机制(注:这些逻辑统一由第三方应用程序完成)。
同时声明(Claims)的安全模型也没必要要求某个用户屡次登陆到多个应用程序,大大简化了用户的身份验证过程。
所以,声明(Claims)的安全很是适合于诸如OAuth等第三方受权的方式和云计算环境。
基于声明(Claims)的安全的实例代码以下:
很明显,用户是/不是什么一般由第三方肯定,所以不少第三方提供了所谓的安全令牌(Security Token)服务。目前有三种标准的令牌(Token)格式,它们是:SAML(安全断言标记语言)、SWT(简单 Web 令牌)、JWT(JSON Web 令牌)。三种令牌格式对好比下:
|
SAML |
SWT |
JWT |
表现形式 |
XML |
HTML Form encoding |
JSON |
处理方式 |
SOAP |
REST |
REST |
直接支持WIF |
是 |
否 |
否 |
协议 |
WS-Trust and WS-Federation
|
OAuth 2.0 |
OAuth 2.0 |
一般的载体 |
HTTP body or URL |
HTTP Auth header (Bearer) |
HTTP Auth header (Bearer) |
支持签名 |
是,非对称密钥-X509证书 |
是, HMAC SHA-256 (使用对称密钥) |
是,支持对称密钥和非对称密钥 |
二、Basic Authentication
在Web Api中不能不提到 Basic Authentication。Basic Authentication 是 HTTP 规范的一部分,它很是的基础和简单。主要工做原理以下:
由于 Base Authentication 的安全性较差,但对于无 Cookie 的 Web Api 来讲,应用上很是的简单和方便。
Base Authentication 最大的缺点是凭据会被浏览器缓存——直到你关闭浏览器为止。若是你已经对某个URI得到了受权,浏览器就会在受权头发送相应的凭据,这使其更容易受到跨站点请求伪造(CSRF)攻击
Base Authentication 一般须要使用HTTPS方式进行加密处理。
3、YbRapidSolution for MVC 中的 Authentication
在 YbRapidSolution for MVC 的安全解决方案中,采用了 Base Authentication 和 Form Authentication 相互补充的处理方式,使用 Attribute 方式进行请求的 Authentication 处理。Base Authentication 主要面向非Web应用的处理请求,Form Authentication 则对 MVC 的 Controller 的请求进行处理,核心代码以下:
从上述代码中能够看出,在 YbRapidSolution for MVC 首先进行 Base Authentication,若是不经过,继续进行 Form Authentication;若是 Base Authentication 经过,则建立 Form 下的 Principal 而后按 Form Authentication 的方式进行统一处理,这能够确保任何类型的客户端都能进行相应的 Authentication 处理,充分发挥出 Web Api 的特性,在为各类类型的客户端和设备提供 API 支持的同时也提供相应的安全保障。
附1:YbRapidSoluton for MVC 在线 Demo 地址:http://mvcdemo.yellbuy.com/。
附2:最新发布的 YbRapidSolution for WinForm Demo下载:运行环境-.NET 4.0。服务层部署在 Internet
上,,可直接运行;如需在本地部署,除了安装数据库外,就是修改配置文件,这里再也不详述。
附3:最新发布的 YbSoftwareFactory V2 下载,运行环境-.NET 4.0。