热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一、设置浏览器客户端

一、设置浏览器客户端如果你在读这本书,那是因为你理解保护你的webAPI的重要性。ASP

一、设置浏览器客户端

如果你在读这本书,那是因为你理解保护你的 web API 的重要性。 ASP.NET Web API 是一个框架,它帮助构建可以被广泛的客户端利用的 HTTP 服务。 所以确保 Web API 的安全是非常重要的。

ASP.NET Web API 1.0 没有任何安全特性,所以安全是由主机(如 Internet Information Server)提供的。 在 ASP.NET Web API 2,安全特性如 Katana 被引入。 为了保护 Web API,让我们了解所涉及的各种技术,并选择正确的方法。

在本章中,我们将涵盖以下主题:


  • ASP.NET Web API 安全体系结构

  • 设置浏览器客户端

  • 认证和授权

  • 在 HTTP 消息处理程序中实现认证

  • 设置主

  • 使用[Authorize]属性

  • 自定义授权过滤器

  • 控制器操作中的授权


NET Web API 安全体系结构

本节将向您概述 Web API 安全体系结构,并向您展示可用于安全相关事务的所有各种扩展点。 ASP.NET Web API 安全体系结构由三个主要层组成。 宿主层充当 Web API 和网络堆栈之间的接口。 消息处理程序管道层支持实现诸如认证和缓存等横切关注点。 控制器处理层是执行控制器和操作、绑定和验证参数以及创建 HTTP 响应消息的地方。 该层还包含一个过滤器管道,如下图所示:

ASP.NET Web API security architecture

图 1 -此图像显示了保护 Web API 所涉及的组件

让我们简要讨论一下 Web API 管道中每个组件的用途,如下所示:


  • Open Web Interface for . net(OWIN)是新的开放标准托管基础设施。 微软已经在 OWIN 和的基础上构建了自己的框架 Katana,所有的 Web API 安全技术,如认证方法(例如,基于令牌的认证)和对社交登录提供商(例如,谷歌和 Facebook)的支持都将在 OWIN 层实现。

  • 消息处理程序是一个类,用于接收 HTTP 请求并返回 HTTP 响应。 不建议在消息处理程序级别实现认证。 消息处理器用于跨源资源共享(CORS)。

  • 认证过滤器保证在授权过滤器之前运行。 如果您对在 OWIN 层操作认证逻辑不感兴趣,您可以直接转移到控制器或操作。 认证过滤器对于调用基于 owen 的认证逻辑非常有用。

  • 授权过滤器是管道中的位置,您可以在实际昂贵的业务逻辑在模型绑定和验证中运行以及控制器动作被调用之前重新检查请求。

现在我们已经熟悉了安全体系结构,接下来我们将设置客户机。

设置浏览器客户端

让我们创建一个用于联系人查找的 Web API。 这个联系人查找 Web API 服务将向调用的客户端应用返回联系人列表。 然后,我们将使用 jQuery AJAX 调用来列出和搜索联系人,使用 Contact Lookup 服务。

这个应用将帮助我们在本书中演示 Web API 安全性。

实现 Web API 查找服务

在这个节中,我们将创建一个联系人查找 web API 服务,该服务返回一个联系人列表,该列表采用Javascript 对象标记(JSON)格式。 使用这个联系人查找的客户端是一个简单的 web 页面,它使用 jQuery 显示联系人列表。 按照以下步骤启动项目:


  1. 在 Visual Studio 的Start页面中创建新项目

  2. 选择 Visual c# Installed Template 命名为Web

  3. 选择ASP.NET Web 应用

  4. Name the project ContactLookup and click OK, as shown in the following screenshot:

    Implementing Web API lookup service

    图 2 -我们已经命名了 ASP.NET Web 应用“ContactLookup”


  5. 新 ASP. net 中选择模板。 对话框。


  6. Check Web API and click OK under Add folders and core references, as shown in the following:

    Implementing Web API lookup service

    图 3 -我们选择空 Web API 模板


我们只是创建了一个空的 Web API 项目。 现在让我们添加所需的模型。

添加模型

让我们从开始,通过以下步骤的帮助创建一个代表联系人的简单模型:


  1. First, define a simple contact model by adding a class file to the Models folder.

    Adding a model

    图 4 -右键单击 Models 文件夹并添加一个 Model 类


  2. 命名类文件Contact 并声明Contact类的属性。

    namespace ContactLookup.Models
    {
    public class Contact
    {
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public string Mobile { get; set; }
    }
    }


我们刚刚添加了一个名为Contact的模型。 现在让我们添加所需的 web API 控制器。

添加控制器

HTTP 请求是由 Web API 中的控制器对象处理的。 让我们定义一个带有两个动作方法的控制器。 一个操作返回联系人列表,另一个操作返回特定于给定 ID 的单个联系人:


  1. Add the Controller under the Controllers folder in Solution Explorer.

    Adding a controller

    图 5 -右键单击 Controllers 文件夹并添加控制器


  2. Select Web API Controller – Empty and click on Add in the Add Scaffold dialog.

    Adding a controller

    图 6 -选择一个空的 Web API 控制器


  3. Let's name the controller ContactsController in the Add Controller dialog box and click Add.

    Adding a controller

    图 7 -命名控制器

    这将在Controllers文件夹中创建ContactsController.cs文件,如下图所示:

    Adding a controller

    图 8 -应用中的 Controllers 文件夹中添加了 ContactsController


  4. 用以下代码替换ContactsController中的代码:

    ```
    namespace ContactLookup.Controllers
    {
    public class ContactsController : ApiController
    {
    Contact[] cOntacts= new Contact[]
    {
    new Contact { Id = 1, Name = "Steve", Email = "steve@gmail.com", Mobile = "+1(234)35434" },
    new Contact { Id = 2, Name = "Matt", Email = "matt@gmail.com", Mobile = "+1(234)5654" },
    new Contact { Id = 3, Name = "Mark", Email = "mark@gmail.com", Mobile = "+1(234)56789" }
    };

    public IEnumerable<Contact> GetAllContacts()
    {
    return contacts;
    }
    public IHttpActionResult GetContact(int id)
    {
    var contact = contacts.FirstOrDefault(x => x.Id == id);
    if (contact == null)
    {
    return NotFound();
    }
    return Ok(contact);
    }
    }

    }
    ```


为简单起见,联系人存储在控制器类中的固定数组中。 控制器定义为,有两个动作方法。 联系人列表将由GetAllContacts方法以 JSON 格式返回,GetContact方法根据其 ID 返回单个联系人。 一个惟一的 URI 应用于控制器上的每个方法,如下表所示:

|

控制器方法

|

尤里

|
| --- | --- |
| GetAllContacts | /api/contacts |
| GetContact | /api/contacts/id |

使用 Javascript 和 jQuery 使用 Web API

在这个节中,为了演示使用或不使用任何安全机制调用 web API,让我们创建一个 HTML 页面,使用 web API 并使用 jQuery AJAX 调用的结果更新页面:


  1. In the Solution Explorer pane, right-click on the project and add New Item.

    Consuming the Web API using Javascript and jQuery

    图 9 -从解决方案资源管理器的上下文菜单中选择 add new item


  2. Create HTML Page named index.html using the Add New Item dialog.

    Consuming the Web API using Javascript and jQuery

    图 10 -添加索引 html 文件通过选择 html 页面在添加新项目对话框


  3. 用以下代码替换index.html文件中的内容:

    ```

    Contact Lookup

    All Contacts





      Search by ID

      var uri = 'api/contacts';

      $(document).ready(function () {
      // Send an AJAX request
      $.getJSON(uri)
      .done(function (data) {
      // On success, &#39;data&#39; contains a list of contacts.
      $.each(data, function (key, contact) {
      // Add a list item for the contact.
      $(&#39;

    • &#39;, { text: formatItem(contact) }).appendTo($(&#39;#contacts&#39;));
      });
      });
      });

    function formatItem(contact) {
    return contact.Name + ', email: ' + contact.Email + ', mobile: ' + contact.Mobile;
    }

    function search() {
    var id = $(&#39;#contactId&#39;).val();
    $.getJSON(uri + &#39;/&#39; + id)
    .done(function (data) {
    $(&#39;#contact&#39;).text(formatItem(data));
    })
    .fail(function (jqXHR, textStatus, err) {
    $(&#39;#contact&#39;).text(&#39;Error: &#39; + err);
    });
    }


    ```



    获取联系人列表

    我们需要向/api/contacts 发送一个 HTTP GET 请求来获取联系人列表。 AJAX 请求由 jQuerygetJSON函数发送,并在响应中接收 JSON 对象数组。 如果请求成功,将调用done函数中的回调函数。 在回调中,我们用联系信息更新 DOM,如下所示:

    $(document).ready(function () {
    // Send an AJAX request
    $.getJSON(uri)
    .done(function (data) {
    // On success, 'data' variable contains a list of contacts.
    $.each(data, function (key, contact) {
    // Add a list item for the contact.
    $('

  4. ', { text: formatItem(contact) }).appendTo($('#contacts'));
    });
    });
    });

  5. 通过 ID 获取联系人

    要通过 ID 获取联系人,向/api/contacts/id发送一个 HTTP get 请求,其中id是联系人 ID。

    function search() {
    var id = $('#contactId').val();
    $.getJSON(uri + '/' + id)
    .done(function (data) {
    $('#contact').text(formatItem(data));
    })
    .fail(function (jqXHR, textStatus, err) {
    $('#contact').text('Error: ' + err);
    });
    }

    getJSON中的请求 URL 有联系人 ID。 响应是此请求的单个联系人的 JSON 表示。

    运行应用

    F5启动调试应用。 输入联系人 ID,点击搜索:

    Running the application

    图 11 -样例基于浏览器的客户端应用的用户界面

    认证授权

    我们创建了一个简单的 web API,它根据 ID 返回联系人列表或特定的联系人。 任何支持 HTTP 的客户端都可以访问这个 web API,但安全性还不够。 在认证和授权机制的帮助下,我们可以保护这个 web API 免受未经授权的访问。


    认证

    认证是在主机Internet Information Service(IIS)中对 web API 进行认证。 Internet 信息服务使用 HTTP 模块进行认证。 我们还可以用自己的 HTTP 模块实现自定义认证。

    主机在对用户进行认证时创建主体。 Principal 是一个IPrincipal对象,它表示运行代码的安全上下文。 您可以从主机连接的Thread.CurrentPrincipal中访问当前的主体。 可以从 principal 的Identity对象访问用户信息。 如果用户通过认证,Identity.IsAuthenticated属性返回true。 如果用户没有被验证,Identity.IsAuthenticated将返回false

    授权

    授权在向控制器提供成功的认证之后发生。 当做出更细粒度的选择时,它帮助您授予对资源的访问权。

    对于任何未经授权的请求,授权筛选器将返回一个错误响应,并且不允许执行该操作。 这是因为授权过滤器将在控制器操作中的任何语句之前首先执行。

    实现 HTTP 消息处理程序中的认证

    对于一个自托管 web API,最佳的实践是在HTTP 消息处理程序中实现认证。 主体将在验证 HTTP 请求后由消息处理程序设置。 对于自托管的 web API,可以考虑在消息处理程序中实现认证。 否则,请使用 HTTP 模块。

    下面的代码片段展示了一个在 HTTP 模块中实现的基本认证示例:

    public class AuthenticationHandler : DelegatingHandler
    {
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
    CancellationToken cancellationToken)
    {
    var credentials = ParseAuthorizationHeader(request);
    if (credentials != null)
    {
    // Check if the username and passowrd in credentials are valid against the ASP.NET membership.
    // If valid, the set the current principal in the request context
    var identity = new GenericIdentity(credentials.Username);
    Thread.CurrentPrincipal = new GenericPrincipal(identity, null);;
    }
    return base.SendAsync(request, cancellationToken)
    .ContinueWith(task =>
    {
    var response = task.Result;
    if (credentials == null && response.StatusCode == HttpStatusCode.Unauthorized)
    Challenge(request, response);
    return response;
    });
    }
    protected virtual Credentials ParseAuthorizationHeader(HttpRequestMessage request)
    {
    string authorizationHeader = null;
    var authorization = request.Headers.Authorization;
    if (authorization != null && authorization.Scheme == "Basic")
    authorizationHeader = authorization.Parameter;
    if (string.IsNullOrEmpty(authorizationHeader))
    return null;
    authorizationHeader = Encoding.Default.GetString(Convert.FromBase64String(authorizationHeader));
    var authenticationTokens = authorizationHeader.Split(':');
    if (authenticationTokens.Length < 2)
    return null;
    return new Credentials() { Username = authenticationTokens[0], Password = authenticationTokens[1], };
    }
    void Challenge(HttpRequestMessage request, HttpResponseMessage response)
    {
    response.Headers.Add("WWW-Authenticate", string.Format("Basic realm=\"{0}\"", request.RequestUri.DnsSafeHost));
    }
    public class Credentials
    {
    public string Username { get; set; }
    public string Password { get; set; }
    }
    }


    设置主体

    如果应用实现了自定义认证逻辑,那么我们必须在两个地方设置主体:

    下面的代码显示了如何设置主体:

    private void SetPrincipal(IPrincipal principal)
    {
    Thread.CurrentPrincipal = principal;
    if (HttpContext.Current != null)
    {
    HttpContext.Current.User = principal;
    }
    }


    使用[Authorize]属性

    AuthorizeAttribute将确保用户是通过验证还是未通过验证。 如果用户未通过认证,且不调用相应的操作,则返回 HTTP 状态码为 401 的未授权错误。 Web API 允许您以三种方式应用筛选器。 我们可以在全局级别、控制器级别或单个操作级别应用它们。

    全局授权过滤器

    为了对所有 Web API 控制器应用授权过滤器,我们需要将AuthorizeAttribute过滤器添加到Global.asax文件的全局过滤器列表中,如下所示:

    public static void Register(HttpConfiguration config)
    {
    config.Filters.Add(new AuthorizeAttribute());
    }


    控制器级授权过滤器

    要为特定的控制器应用授权过滤器,我们需要用 filter 属性装饰控制器,如下代码所示:

    // Require authorization for all actions on the controller.
    [Authorize]
    public class ContactsController : ApiController
    {
    public IEnumerable<Contact> GetAllContacts() { ... }
    public IHttpActionResult GetContact(int id) { ... }
    }


    动作级别授权过滤器

    要对特定的动作应用授权过滤器,我们需要将属性添加到 action 方法中,如下代码所示:

    public class ContactsController : ApiController
    {
    public IEnumerable<Contact> GetAllContacts() { ... }
    // Require authorization for a specific action.
    [Authorize]
    public IHttpActionResult GetContact(int id) { ... }
    }


    自定义授权过滤器

    要实现自定义授权筛选器,我们需要创建派生AuthorizeAttributeAuthorizationFilterAttributeIAuthorizationFilter的类。


    控制器动作中的授权

    有时,可能需要在基于主体处理请求后更改行为。 在这种情况下,我们可以在控制器操作中实现授权。 例如,如果您想根据用户的角色操作响应,我们可以通过动作方法本身的ApiController.User属性验证登录的用户角色:

    public HttpResponseMessage Get()
    {
    if (!User.IsInRole("Admin"))
    {
    // manipulate the response to eliminate information that shouldn't be shared with non admin users
    }
    }


    总结

    这很容易,不是吗? 我们刚为 APS 设置了安全系统.NET Web API,我们将在接下来的章节中构建它。

    您学习了 ASP 的安全体系结构.NET Web API,它提供了一个整体的视图。 然后我们设置浏览器客户机,从实现 Web 查找服务到使用 Javascript 和 jQuery 代码调用 Web API。

    您还学习了认证和授权技术,我们将在本书后面详细介绍这些技术。 接下来,您了解了 HTTP 消息处理程序、Principal 和用于控制用户授权的[Authorize]属性。

    最后,您了解了自定义授权和控制器操作中的授权,以便在基于主体处理请求后更改行为。

    你在这一章学到了很多东西。 然而,这仅仅是个开始。 在下一章中,您将实现 Web API 的安全套接字层。 让我们开始吧!


    推荐阅读
    • HTML5网页模板怎么加百度统计?
      本文介绍了如何在HTML5网页模板中加入百度统计,并对模板文件、css样式表、js插件库等内容进行了说明。同时还解答了关于HTML5网页模板的使用方法、表单提交、域名和空间的问题,并介绍了如何使用Visual Studio 2010创建HTML5模板。此外,还提到了使用Jquery编写美好的HTML5前端框架模板的方法,以及制作企业HTML5网站模板和支持HTML5的CMS。 ... [详细]
    • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
    • svnWebUI:一款现代化的svn服务端管理软件
      svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
    • Unity3D引擎的体系结构和功能详解
      本文详细介绍了Unity3D引擎的体系结构和功能。Unity3D是一个屡获殊荣的工具,用于创建交互式3D应用程序。它由游戏引擎和编辑器组成,支持C#、Boo和JavaScript脚本编程。该引擎涵盖了声音、图形、物理和网络功能等主题。Unity编辑器具有多语言脚本编辑器和预制装配系统等特点。本文还介绍了Unity的许可证情况。Unity基本功能有限的免费,适用于PC、MAC和Web开发。其他平台或完整的功能集需要购买许可证。 ... [详细]
    • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
      本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
    • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
    • Java序列化对象传给PHP的方法及原理解析
      本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
    • 如何使用Java获取服务器硬件信息和磁盘负载率
      本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
    • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
    • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
      本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
    • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
    • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
    • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
      本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
    • 从零基础到精通的前台学习路线
      随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
    • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
      本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
    author-avatar
    tuigone
    这个家伙很懒,什么也没留下!
    Tags | 热门标签
    RankList | 热门文章
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有