它们是适合HTTP无状态天性的,惯例上会直接匹配Get的http方法

Custom Basic
Authentication
(自定义基本表明)——涉及在基础结构级别(如IIS)上开展的骨干质询响应(challenge-response)验证的光景。要是不难的用户名/密码不或许满足必要,还要扶助用户/密码音讯存储在数据库中的情状。

制造WebAPI项目流程

  1. 创建DAL
  2. 创建Repository和Unit of Work
  3. 创建Entities
  4. 创建Services
  5. 创建WebAPI
  6. 创建IOC
  7. 运用MEF解耦依赖注册涉嫌
  8. 自定义路由
  9. 创设Exception处理和日志功能
  10. 创制单元测试

Questions:

  1. Context.Entry(entity).State = EntityState.Modified;
  2. IQueryable
  3. UnitOfWork继承IDisposable

Cause:他索要自由链接

  1. DbEntityValidationException e.EntityValidationErrors
  2. GC.SuppressFinalize

———– 1 GAC DLLs —————–

Https下的Web Api

Https/SSL  是管制总计机互连网消息能源传输安全的协议。先介绍一下双边

Certificate
:也等于电子证书,是一种电子签名,它通过绑定公钥来确认用户、设备、服务,以及对应的私钥

Certificate Authority(CA):首要用途是点名哪些UCRUISERL是可靠任的ULacrosseL

④ 、注册管理端

介绍

本文为私有对WebApi的追思无参考价值。

正文内容:

  1. Rest和UnitOfWork
  2. 创建WebAPi的流程
  3. IOC-Unity的使用
  4. MEF
  5. 自定义URL
  6. Base认证和Token自定义权限
  7. 日志NLog
  8. OData的使用
  9. Owin自宿主的利用

代码地址:https://github.com/OtherRuan/Review-Serials

rem ———– 2 Register Schema —————–
iisschema.exe /install CustomBasicAuthentication_schema.xml

动用ActionFilter创建基于WebApi认证安全和依照Token的自定义权限

供销社级应用的安全尤为重大,特别是因而劳务揭露大家的业务数据。先介绍一下情节:

  1. Authentication认证

Authentication认证用于确认终端用户,验证用户是不是有权力访问系统。等会通过Basic
Authentication技术来领悟什么在webapi中落成authentication效率。

  1. Authorization授权

Authorization授权可以精晓为做完Authentication认证后的第2部完成安全机制。并不是具有可以访问系统的用户都能访问具有模块比如action。Authorization通过安装角色和批准给终端用户,大概经过提供安全的token,来钦点用户是不是可以访问具连串统能源。

  1. 持久化Session

RESTful服务办事在无状态的合计,比如HTTP。我们可以透过依据token授权技术来得以完毕持久化Session的机能。一个授权过的用户,允许你在自然时间内访问财富,且能透过延长session的得力时间来重新实例化请求访问能源。使用WebAPI的站点可以经过Basic
Authentication和Token Base authorization来持久化session.

Basic Authentication

Basic认证是一种机制。当用户请求服务时,会将用户名密码等嵌套在请求头。服务接受请求后证实证书是还是不是可行,然后回到响应结果。无效证书对应的响应结果是401,代表无权力访问。

亮点:简单落成,帮助全部浏览器,并且变成RESTful的正规化认证。

症结:用户证书蕴涵在伸手头,很简单蒙受攻击。没有持久化Session,一旦用户登录且屡屡发送过证件给劳务的时候,就不可能脱离。而且格外不难受到攻击,如CSLacrosseF

基于Token授权

Token一般为加密后的key,只有服务器或许服务明白它的含义。当用户发送请求并传递token的时候,服务器通过token判断用户是或不是有权力访问系统。生成后的Token可以被存到数据库大概布置文件中。Token有投机的生命周期,有失效时间。

WebAPI使用Basic认证和Token授权的流水线:

  1. 开创用户表
  2. 创建Service和Repository
  3. IOC
  4. 创建AuthorizationFilterAttribute
    1. 实现OnAuthrozation

                      i.      获取用户相关音信GenericIdentity

filterContext.Request.Headers.Authorization.

Scheme==”Basic”

Parameter.split(“:”) [0] username, [1]password

                      ii.      调用Service获取数据库用户音信,举办认证

  5. 经过添加属性过滤,或许在global添加全局过滤

[ApiAuthenticationFilter]

GlobalConfiguration.Configuration.Filters.Add(new ApiAuthenticationFilter());

布署缺陷

每3次呼吁都发送用户密码。即使我创制1个利用,那个应用的验证只在自家登录的时候发出一回。那时小编也有权力访问其余服务。我们的运用应该更安全,他要能约束及时认证过的用户,不可能访问尚未授权给她的劳动。

透过Token来贯彻授权。只揭发比如登录的服务给用户。当用户登录成功后,发送三个token(可以是GUID恐怕加密的key)给用户,每二遍呼吁时都要带上那么些token。在持久化session方面,token有失效时间,一般为1肆分钟,可以在web.config做个入口配置。在session过期后,用户登出,重新登录获取新的token。

rem Server configuration module
gacutil -if LeastPrivilege.CustomBasicAuthentication.Management.dll

IOC – Unity

Unity
是轻量级、可伸张的依靠注入容器,接济构造函数注入、属性注入和措施调用注入。

Unity的优势:

  1. 提供简单的对象成立,越发是分段对象协会和依赖。
  2. 提供抽象需求。允许开发职员在运行时如故陈设中钦赐正视。
  3. 日增灵活性,推迟组件配置到容器中
  4. 它有叁个当地服务力量。允许用户保存或缓存容器。这几个专门适用于Asp.Net
    web应用程式中,持久化Session和application容器

创制流程:

  1. 安装Unity for MVC
  2. 创建Bootstrapper.cs文件
    1. Initialise()

注册对应反转珍惜

  1. Application_Start()

Bootstrapper.Initialise();

  2. 构造函数注入

private IEmployeeService _employeeService;

        public UserController(IEmployeeService employeeService)

        {

            _employeeService = employeeService;

        }
  • 一是在请求头中添加Authorization:
    Authorization: “Basic 用户名和密码的base64加密字符串”
  • 二是在url中添加用户名和密码:

Repository和Unit of Work

Repository方式好处:

  1. 集中了多少和web服务走访逻辑
  2. 支撑单元测试
  3. 提供了灵活架构以适应整个应用设计的扩张

Unit of Work的职责:

  1. 治本工作
  2. 有序化数据的插入、删除、更新操作
  3. 预防重复的更新。

动用Unit of Work形式的便宜是力所能及让您更关爱于工作逻辑。

伍 、在切实的Web应用程序中安装,主要参考上边的文章:

MEF(Managed Extensibility Framework)

尽管事先IOC此前收缩了部分看重,但是Domain Model仍旧凭借在API中。

轻耦合架构需求形成以下几点:

  1. Domain Model:只跟Service层关联
  2. Services:只跟REST终端和Domain Model关联
  3. REST API,相当于Controller,通过IOC,跟Services暴光的接口关联

为了化解API器重Domain Model,大家运用MEF举办解耦。

MEF(Managed Extensibility
Framework)是多少个用于创设可伸张的轻型应用程序的库。 应用程序开发人士可应用该库发现并采纳增添,而无需进行布署。 扩大开发人士还足以应用该库轻松地卷入代码,防止生成脆弱的硬重视项。 通过
MEF,不仅能够在应用程序内重用扩充,还可以在应用程序之间重用伸张。(摘自MSDN)

流程:

  1. 删除原有容器的挂号配置
    container.RegisterType<IEmployeeService, EmployeeBusinessLayer>()
                        .RegisterType<UnitOfWork>(new HierarchicalLifetimeManager());
    

  2. 创建Resolver类库

    a. 添加Unity.MVC

    b. 添加引用:System.ComponentModel.Composition

      那么些DLL是MEF的一某个,提供MEF的主旨类

    c. 添加接口IComponent

      包涵方法initialization方法Setup, 组合IRegisterComponent

    d. 添加接口IRegisterComponent

      定义RegisterType等容器的办法

    e. 添加ComponentLoder加载类。

      包含LoadContainer,加载内定path路径的dll里的具有带有Export属性并无冕IComponent的modules,执行他们的setup方法也等于挂号器重关系。

var dirCat = new DirectoryCatalog(path, pattern);
            var importDef = BuildImportDefinition();
            try
            {
                using (var aggregateCatalog = new AggregateCatalog())
                {
                    aggregateCatalog.Catalogs.Add(dirCat);
                    using (var componsitionContainer = new CompositionContainer(aggregateCatalog))
                    {
                        var exports = componsitionContainer.GetExports(importDef);
                        var modules = exports.Select(export => export.Value as IComponent).Where(m => m != null);
                        var registerComponent = new RegisterComponent(container);
                        foreach (var module in modules)
                        {
                            module.SetUp(registerComponent);
                        }
                    }
                }

    f. 各种须要做IOC的类库下,添加类DependencyResolver,继承IComponent,完毕SetUp方法,方法内部贯彻RegisterType效率,达到依赖注册的效益。添加属性Export

[Export(typeof(IComponent))]
    public class DependencyResolver : IComponent
    {
        public void SetUp(IRegisterComponent registerComponent)
        {
            registerComponent.RegisterType<IUnitOfWork, UnitOfWork>();
        }
    }

  3. 改动原来配置为如下:

ComponentLoader.LoadContainer(container, ".\\bin", "Services.dll");

使用MEF的好处:

  1. 使应用程序更解耦和可增加。扩张的时候,只须要以相同的法子添加新的DependencyResolver类,没有看重。
  2. 借助于注册通过反射自动生成。只须求钦点相应的dll的地点,如在bin下。
  3. 数据库事务可能有个别模块不想暴露到服务终端时,MEF就变得更安全且不破坏当前安顿布局。

在你拜访1个索要HTTP Basic
Authentication的U逍客L的时候,假如您从未提供用户名和密码,服务器就会回到401,假如您直接在浏览器中开拓,浏览器会提醒您输入用户名和密码(google浏览器不会).

WebApi的几点天性

WebApi 提供了几点本性:

  1. 自动匹配HTTP方法

GetMethod(), 惯例上会直接匹配Get的http方法。

Web Api允许方法同时具有各类type,比如:

        [AcceptVerbs(“Delete”,”Get”)]

        Public HttpResponseMessage MultiMethod();

        MultiMethod可以同时为Delete、Get两体系型的http请求使用

  1. Web Api还提供自定义Route的意义,比如定义本人的参数,如下

                [Route(“data/{param1}/{param2}”)]

                Public object GetData(string param1, string param2){}

                请求地址:http://localhost/data/1/2

Route属性有以下5种,用于帮您重定义你的API路由

a)      ActionName: 定义你本身的路由的Action名称

b)      Http Method(httpGet,HttpPost,AcceptVerbs…): 
定义你的HTTP方法类型和版本等相关音讯

c)       NonAction: 预防当前的Action没有被调用

d)      Route: 自定义路由,可设置参数

e)     
RoutePrefix:在controller上定义前缀,Controller下的所有Action路由都会自动带上从前缀

  1. HttpClient, HttpRequestMessage, HttpResponseMessage

Custom Security OData Service – Wcf Data Services

应用AttributeRouting重写自定义URubiconL

流程:

  1. 在WebConfig的Register方法中,替换为MapHttpAttributeRoute();如下:

    public static class WebApiConfig

    {
    
        public static void Register(HttpConfiguration config)
    
        {
    
            //config.Routes.MapHttpRoute(
    
            //    name: "DefaultApi",
    
            //    routeTemplate: "api/{controller}/{id}",
    
            //    defaults: new { id = RouteParameter.Optional }
    
            //);
    
            config.MapHttpAttributeRoutes();
    
        }
    
    }
    

  2. Global.ascx中,替换原来的挂号

protected void Application_Start()

        {

            //WebApiConfig.Register(GlobalConfiguration.Configuration);

            GlobalConfiguration.Configure(WebApiConfig.Register);

}

  3. 二种Route自定义形式

    a. Controller上安装前缀

[RoutePrefix("users/user")]

[RoutePrefix("v1/users/user")]

    b. Action上自定义路由

[Route("u/{id?}")]

[Route("u/{id:range(1,3)}")]

[Route("u/id/{e:regex(^[0-9]$)}")]

[Route("~/myroute/users")]

3、注册CustomBasicAuthentication_schema

拔取Action Filter, Exception Filter达成WebAPI的日志容错功效

NLog的使用

  1. Nuget下载NLog
  2. 配置NLog
    1. ConfigSection的配置

澳门正规网上娱乐 1

      2. NLog节点的布署

澳门正规网上娱乐 2

  3. Web项目中添加APILog文件夹

  4. 添加Helpers文件夹,添加以下多少个文件

    1. NLogger类

      继承ITraceWriter的Trace方法,首要用于记录全部类型的荒谬和新闻的日志。

  5. 添加LoggingFilterAttribute继承Action Filter

    将NLogger类引入

  6. 注册LoggingFilterAttribute到Global

错误日志

  1. 添加GlobalExceptionAttribute类,继承ExceptionFilterAttribute,实现OnException方法

将NLogger注入

  2. 其余操作如日志一样

自定义错误日志

可以将错误分成三大类:API级其他错误、业务错误、数据失实

  1. 添加接口IApiException

    包蕴属性Error的主干新闻属性

  2.
各添加七个类ApiException、ApiBusinessException、ApiDataException,继承IApiException和Exception

  3. 引用JSon序列化

    Log需求可以连串化成json以便大家可以将日志对象传输到种种模块中去。

  4. 修改从前的NLogger类

  5. 修改GlobalExceptionAttribute

  6. 在Controller中,抛出我们自定义的谬误类

rem ———– !!! RUN AS ADMINISTRATOR !!!
rem —
② 、将次第集注册到GAC

WebAPI中的OData

OData是一种协议,它提供灵活创造可查询的REST服务,准确的说,它提供各种查询接纳,如参数,来决定你实际要询问的数量。如上面链接

http://localhost/Products?$orderby=Name

OData允许你创立可查询的服务,当终端服务支撑OData时,你能够过滤请求结果,比如提取前n条数据,排序,选择某条数据等等。

询问采纳

ASP.NET WebAPI援救以下二种:

  1. $orderby:排序
  2. $select:接纳某列或许有个别属性
  3. $skip:与Linq类似,跳过前N条数据,提取N+1后数据
  4. $top:前N条
  5. $expand:增加实体
  6. $filter:过滤
  7. $inlinecount:类似分页

使用流程

  1. nuget安装OData
  2. 在Api里的结果集中引用方法AsQueryable(),设置成可查询

    _employeeService.GetAll().AsQueryable()

  3. 种种查询采取的行使

    a. $top

    /Employee/All?$top=2

    b. $filter

    /Employee/All?$ filter =name eq ‘Ryan ’  获取name等于Ryan的数据

澳门正规网上娱乐,    /Employee/All?$ filter =id lt 3  获取id小于3的数据

    c. $orderby

    /Employee/All?$ orderby =name desc

    d. $orderby和 $top一起用

    /Employee/All?$top=2&orderby = name desc

    e. $skip

    /Employee/All?$top=5$skip=2 取第叁条初阶的前5条数据,3-7

Filter的操作符

eq

等于

$filter=revenue eq 100

ne

不等于

$filter=revenue ne 100

gt

大于

$filter=revenue gt 100

ge

大于等于

$filter=revenue ge 100

lt

小于

$filter=revenue lt 100

le

小于等于

$filter=revenue le 100

and

$filter=revenue lt 100 and revenue gt 2000

Or

$filter=contains(name,'(sample)’) or contains(name,’test’)

Not

不包含

$filter=not contains(name,’sample’)

( )

括号域

(contains(name,’sample’) or contains(name,’test’)) and revenue gt 5000

查询函数

Contains

$filter=contains(name,'(sample)’)

endswith

$filter=endswith(name,’Inc.’)

startswith

$filter=startswith(name,’a’)

    f. 分页

    添加属性[Queryable(PageSize = 10)]

    g. 设置可允许的选项

 [Queryable(AllowedQueryOptions =AllowedQueryOptions.Filter | AllowedQueryOptions.OrderBy)]

    h. 允许具体的排序范围

[Queryable(AllowedOrderByProperties = "ProductId")]

    i. 允许操作符范围

[Queryable(AllowedLogicalOperators = AllowedLogicalOperators.GreaterThan)]

    j. 允许总结操作符的限量

[Queryable(AllowedArithmeticOperators = AllowedArithmeticOperators.Add)]

要在殡葬请求的时候添加HTTP Basic
Authentication认证音讯到请求中,有三种艺术:

参考文献

http://www.codeproject.com/Articles/659131/Understanding-and-Implementing-ASPNET-WebAPI

http://www.codeproject.com/Articles/838274/Web-API-Thoughts-of-Data-Streaming

http://www.codeproject.com/Articles/990492/RESTful-Day-sharp-Enterprise-Level-Application\#\_Toc418969124

http://www.codeproject.com/Articles/889242/WebAPI-Self-Hosting-Using-OWIN

http://www.codeproject.com/Articles/631668/Learning-MVC-Part-Repository-Pattern-in-MVC-App

http://www.codeproject.com/Articles/640294/Learning-MVC-Part-Generic-Repository-Pattern-in

面对用户认证的题材。最广大的贯彻方式相似是如此的:用户提交2个涵盖用户名和密码的表单,服务端脚本作证其合法性,假使通过认证,则在Session里标识一下,如此一来,在同三个Session周期里,用户就保持了友好的认证状态。基于Session的声明最大的标题在于它不相符REST风格,更直白一点说,它损坏了HTTP的无状态性格,从而对可伸张性造成障碍。
RFC2617里规定的三种标准的证实方式(Baisc,Digest),和Session情势最根本的例外是,它们是符合HTTP无状态天性的,所以相对而言更值得推荐。

创立自宿主的WebAPI-OWIN

  1. 添加console应用
  2. Nuget安装webapi owin self-host
  3. 添加api
  4. 添加Startup类

    使用httpConfiguration创造路由,通过appBuilder.UseWebApi方法添加到请求管道中

   澳门正规网上娱乐 3

  5.Main函数中运用Api项目里的Startup类

 澳门正规网上娱乐 4

  6. 运行console

连带作品:

对于IIS
7来说,Codeplex上有个体系方可缓解那个题材:http://custombasicauth.codeplex.com

WCF Data
Services团队如今见报了一体系有关OData服务和客户端上可用验证机制的篇章。具体参看http://www.infoq.com/cn/news/2010/07/odata-authentication-series,其中也有介绍到HTTP
Basic Authentication :

一 、已管理员身份打开命令行

什么是HTTP Basic
Authentication?直接看http://en.wikipedia.org/wiki/Basic_authentication_scheme吧。

customBasicAuth的安装形式:

rem Client UI module
gacutil -if
LeastPrivilege.CustomBasicAuthentication.Management.Client.dll

http://franssenden.wordpress.com/2010/06/14/custom-security-odata-service-wcf-data-services/

http://www.leastprivilege.com/HTTPBasicAuthenticationAgainstNonWindowsAccountsInIISASPNETPart3AddingWCFSupport.aspx

rem———– 2 Register Management  —————–
IisRegMgmt CustomBasicAuth
LeastPrivilege.CustomBasicAuthentication.Management.CustomBasicAuthenticationModuleProvider
LeastPrivilege.CustomBasicAuthentication.Management.dll

rem HTTP module
gacutil -if LeastPrivilege.CustomBasicAuthenticationModule.dll