ASP.NET Web API Security

Posted 分而治之

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET Web API Security相关的知识,希望对你有一定的参考价值。

实现安全的方式既可以是host提供,也可以框架提供。

1,HTTP Module 方式,工作在IIS上,所以web api要托管在IIS上才行。其作用于HTTP管道的最前端,所以这种方式影响的是全局,对每一个请求都要拦截,因此弹性不足。

2,OWIN Middleware,Owin是新一代Asp.Net Web开发架构,有着非常简单的规范定义,目标是用于解耦Web Server和Web Application.,不再依赖System.Web,Middleware也是属于请求拦截器,类似HTTP Module,会拦截所有的请求,影响全局。其作用于OWIN pipeline(因此需要满足OWIN标准的web服务器支持),Web API 2框架也支持这种方式。中间件的好处是可在不同框架中通用,例如MVC,同时OWIN解耦了web服务器(IIS),因此中间件可以在自托管或者非IIS上使用。当然也支持微软自家的IIS,前提是(IIS-integrated) ASP.NET pipeline。

中间件的注册

using Owin;
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.Use<AuthenticationMiddleware>();
        app.Use<CacheMiddleware>();
    }
} 

  

要忽略host level的中间件,可以使用如下方法

 public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
            config.SuppressDefaultHostAuthentication();//忽略host默认的认证方式
        }
    }

 

这里的host其实是一个进程,owin程序的载体,目前有三种(IIS/ASP.NET,Custom Host,OwinHost.exe),Server的作用是open a network socket, listen for requests, and send them through the pipeline of OWIN components specified by the user。目前server有两种实现Microsoft.Owin.Host.SystemWeb和Microsoft.Owin.Host.HttpListener

参考:http://www.asp.net/aspnet/overview/owin-and-katana/an-overview-of-project-katana

owin托管在IIS中(需要Microsoft.Owin.Host.SystemWeb.dll支持)

3,Message Handler方式,前两种都是属于host提供的方式,而Message Handler是web api框架提供的。他不依赖host或者server。但是它的作用粒度还是不够细,只能作用于全局或者特定的路由。

 

作用范围实例:

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

        config.Routes.MapHttpRoute(
            name: "Route2",
            routeTemplate: "api2/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional },
            constraints: null,
            handler: new MessageHandler2()  // per-route message handler,特定路由
        );

        config.MessageHandlers.Add(new MessageHandler1());  // global message handler,全局
    }
}

 

4,Filter方式,这类似MVC过滤器概念。同样是由web api框架提供的,不依赖host或者server,可以作用于全局、控制器、Action级别。

请求顺序是:先经过认证过滤器(authentication filters),再经过授权过滤器(authorization filters)

 设计认证过滤器的原则是:仅负责验证凭据(only responsibility of validating the credential)

如果凭证不存在,则忽略(不处理匿名请求),如果存在但是验证失败,则返回unauthorized(context.ErrorResult=UnauthorizedResult)

如果存在并验证通过,则设置context.Principal,这个属性是IPrincipal的实现,是基于角色的的访问控制,而不是Claims-based的

全局作用范围注册方法:

public static void Register(HttpConfiguration config)
{
    config.Routes.MapHttpRoute(
        name: “DefaultApi”,
        routeTemplate: “api/{controller}/{id}”,
        defaults: new { id = RouteParameter.Optional }
    );
 
    // add global authorization filter
    config.Filters.Add(new ClaimsAuthorizeAttribute());
}

注意示例中的继承关系

ClaimsAuthorizeAttribute继承自System.Web.Http.AuthorizeAttribute

AuthorizeAttribute继承自System.Web.Http.Filters.AuthorizationFilterAttribute

 

5,以上几种方式混合使用时,对于IIS,请求管道中顺序如下所示:

 

以上是关于ASP.NET Web API Security的主要内容,如果未能解决你的问题,请参考以下文章

asp.net web api c# interface dataprovider

如何在 .Net Web API 中包含 System.Web.Http.Cors 参考 dll

Asp.Net Web API 2第五课——Web API路由

ASP.NET Web API教程1.1 第一个ASP.NET Web API

Asp.Net Web API 2第三课——.NET客户端调用Web API

Web API1.1 ASP.NET Web API入门