zoukankan      html  css  js  c++  java
  • 【Web API2】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,请求管道中顺序如下所示:

  • 相关阅读:
    Linux 软件安装到哪里合适,目录详解
    python如何判断1个列表中所有的数据都是相等的?
    web接口开发基础知识-什么是web接口?
    MIME TYPE是什么?
    jenkins展示html测试报告(不使用html publisher)
    【转】Java虚拟机的JVM垃圾回收机制
    Map 排序
    sql in 和 exist的区别
    distinct和group by 去掉重复数据分析
    sql执行机制
  • 原文地址:https://www.cnblogs.com/imust2008/p/5644641.html
Copyright © 2011-2022 走看看