DotNetOpenAuth实践之WebApi资源服务器

系列目录:

DotNetOpenAuth实践系列(源码在这里)

上篇我们讲到WCF服务作为资源服务器接口提供数据服务,那么这篇我们介绍WebApi作为资源服务器,下面开始:

一、环境搭建

1、新建WebAPI项目

2、利用Nuget添加DotNetOpenAuth

注意:

Nuget里面的 NotNetOpenAuth 5.0.0 alpha3有bug,要到github(DotNetOpenAuth)里面下源码自己编译,用编译的dll替换掉Nuget引用的dll

3、把上次制作的证书文件拷贝的项目中

二、关键代码编写

1、公共代码

ResourceServerConfiguration

 1 using System.Security.Cryptography.X509Certificates;
 2
 3 namespace WebApiResourcesServer.Code
 4 {
 5     public class ResourceServerConfiguration
 6     {
 7         public X509Certificate2 EncryptionCertificate { get; set; }
 8         public X509Certificate2 SigningCertificate { get; set; }
 9     }
10 }

Common.cs

1 namespace WebApiResourcesServer.Code
2 {
3     public class Common
4     {
5         public static ResourceServerConfiguration Configuration = new ResourceServerConfiguration();
6     }
7 }

Global.cs

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Security.Cryptography.X509Certificates;
 5 using System.Web;
 6 using System.Web.Http;
 7 using System.Web.Mvc;
 8 using System.Web.Optimization;
 9 using System.Web.Routing;
10 using WebApiResourcesServer.Code;
11
12 namespace WebApiResourcesServer
13 {
14     public class WebApiApplication : System.Web.HttpApplication
15     {
16         protected void Application_Start()
17         {
18             Common.Configuration = new ResourceServerConfiguration
19             {
20                 EncryptionCertificate = new X509Certificate2(Server.MapPath("~/Certs/idefav.pfx"), "a"),
21                 SigningCertificate = new X509Certificate2(Server.MapPath("~/Certs/idefav.cer"))
22             };
23             AreaRegistration.RegisterAllAreas();
24             GlobalConfiguration.Configure(WebApiConfig.Register);
25             FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
26             RouteConfig.RegisterRoutes(RouteTable.Routes);
27             BundleConfig.RegisterBundles(BundleTable.Bundles);
28         }
29     }
30 }

注意:

这里有个地方要注意,就是认证服务器上面用公钥加密,在资源服务器要用私钥解密,所以ResourceServeConfiguration里面传进去的证书是和认证服务器里面的是对调的

2、重写DelegatingHandler

 1 using DotNetOpenAuth.OAuth2;
 2 using System;
 3 using System.Net.Http;
 4 using System.Security.Cryptography;
 5 using System.Security.Principal;
 6 using System.Threading;
 7 using System.Threading.Tasks;
 8 using System.Web;
 9
10 namespace WebApiResourcesServer.Code
11 {
12     public class OAuth2Handler : DelegatingHandler
13     {
14         private static async Task<IPrincipal> VerifyOAuth2(HttpRequestMessage httpDetails, params string[] requiredScopes)
15         {
16             // for this sample where the auth server and resource server are the same site,
17             // we use the same public/private key.
18             var resourceServer = new ResourceServer(new StandardAccessTokenAnalyzer((RSACryptoServiceProvider)Common.Configuration.SigningCertificate.PublicKey.Key, (RSACryptoServiceProvider)Common.Configuration.EncryptionCertificate.PrivateKey));
19             return await resourceServer.GetPrincipalAsync(httpDetails, requiredScopes: requiredScopes);
20         }
21
22         protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
23         {
24             if (request.Headers.Authorization != null && request.Headers.Authorization.Scheme == "Bearer")
25             {
26
27                 var principal =VerifyOAuth2(request);
28
29                 if (principal.Result != null)
30                 {
31                     HttpContext.Current.User = principal.Result;
32                     Thread.CurrentPrincipal = principal.Result;
33                 }
34
35
36             }
37
38             return base.SendAsync(request, cancellationToken);
39         }
40
41     }
42 }

3、App_Start/WebApiConfig.cs里面添加OAuthHandler

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web.Http;
 5 using WebApiResourcesServer.Code;
 6
 7 namespace WebApiResourcesServer
 8 {
 9     public static class WebApiConfig
10     {
11         public static void Register(HttpConfiguration config)
12         {
13             // Web API 配置和服务
14             config.MessageHandlers.Add(new OAuth2Handler());
15             // Web API 路由
16             config.MapHttpAttributeRoutes();
17
18             config.Routes.MapHttpRoute(
19                 name: "DefaultApi",
20                 routeTemplate: "api/{controller}/{id}",
21                 defaults: new { id = RouteParameter.Optional }
22             );
23         }
24     }
25 }

4、设置要验证的接口

三、测试

打开解决方案属性,设置启动项目,启动认证服务器和WebApi资源服务器

利用Post工具访问认证服务器获取access_token

本次获取的Token的有效期为5分钟,超过5分钟要重新获取

用access_token范围WebAPI接口

我们手动改一下Token

下篇我们看一下Webform的ashx做的接口如何做资源服务器实现Authorization

时间: 2024-07-30 13:47:53

DotNetOpenAuth实践之WebApi资源服务器的相关文章

DotNetOpenAuth实践之WCF资源服务器配置

上一篇我们写了一个OAuth2的认证服务器,我们也获取到access_token,那么这个token怎么使用呢,我们现在就来揭开 一般获取access_token用处就是访问接口资源,不然也用不到怎么大费周章的还要获取个token再去访问资源 而接口有几类: WCF服务接口,WebApi,还有自己用如ashx,aspx写的接口提供给前端调用的接口 其中WCF接口DotNetOpenAuth.Sample例子中已经做了 这些接口公开对外就需要一个认证的过程才能访问(当然内部或者内网使用的也不用这么

DotNetOpenAuth实践之Webform资源服务器配置

系列目录: DotNetOpenAuth实践系列(源码在这里) 上篇我们讲到WebApi资源服务器配置,这篇我们说一下Webform下的ashx,aspx做的接口如何使用OAuth2认证 一.环境搭建 1.新建Webform项目 2.使用Nuget添加DotNetOpenAuth 5.0.0 alpha3 3.把上次制作的证书文件拷贝的项目中 二.编写关键代码 1.公共代码 ResourceServerConfiguration 1 using System.Security.Cryptogra

DotNetOpenAuth实践

DotNetOpenAuth实践之搭建验证服务器 DotNetOpenAuth是OAuth2的.net版本,利用DotNetOpenAuth我们可以轻松的搭建OAuth2验证服务器,不废话,下面我们来一步步搭建验证服务器 本次搭建环境: .net4.5.1 ,DotNetOpenAuth v5.0.0-alpha3,MVC5 一.环境搭建 1.新建一个空的VS解决方案 2.添加验证服务器项目,项目选择MVC,不要自带的身份验证 3.使用Nuget添加DotNetOpenAuth v5.0.0-a

Unity3d 从资源服务器下载资源(一)

项目里面的许多资源都是从资源服务器加载的,这样子可以减小客户端的包大小. 所以我们需要一个专门的类来管理下载资源. 资源分很多类型,如:json表,txt文件,image文件,二进制文件,UIAtlas图集,AssetBundle等. 所以,首先创建一个管理资源文件类型的类LoadFileType. 其中文件类型可以用枚举来表示,也可以用类成员常量来表示. 此处使用类成员常量: 1 using UnityEngine; 2 using System.Collections; 3 4 5 name

【Unity3d】【项目学习心得】从资源服务器下载资源(一)

项目里面的许多资源都是从资源服务器加载的,这样子可以减小客户端的包大小. 所以我们需要一个专门的类来管理下载资源. 资源分很多类型,如:json表,txt文件,image文件,二进制文件,UIAtlas图集,AssetBundle等. 所以,首先创建一个管理资源文件类型的类LoadFileType. 其中文件类型可以用枚举来表示,也可以用类成员常量来表示. 此处使用类成员常量: using UnityEngine; using System.Collections; namespace Asse

【Unity3d】【项目学习心得】从资源服务器下载资源(二)

继上篇的基础准备 从资源服务器下载资源(一) 我们现在继续进一步完成 LoadManager 管理类. 管理类因为在全局中都是存在的,所以应该作为单例存在. 因为LoadManager 类是管理多个 LoadRequest的,所以我们需要存储当前正在下载的LoadRequest,以及下载完成的 LoadRequest. 另外,我们为了防止太多下载线程占用过多资源,我们对于下载的线程个数做一定的限制,如项目里面的最大线程数为2,所以我们需要一个存储LoadRequest的等待队列. 根据以上分析,

【学习Koa】原生koa2 静态资源服务器例子

实现思路 首先读取当前路径下所有的文件和文件夹 当去点击某个列表项时判断其实文件还是文件夹,文件的话直接读取,文件夹则再次利用上一个步骤读取并展示 文件结构 代码 index.js 入口文件 const Koa = require('koa') const path = require('path') const getContent = require('./util/content') const mimes = require('./util/mimes') const app = new

Nginx——静态资源服务器(一)

java web的项目中,我们经常将项目部署到Tomcat或者jetty上,可以通过Tomcat或者jetty启动的服务来访问静态资源.但是随着Nginx的普及,用Nginx来作为静态资源服务器,似乎有着更高的性能.接下来的Nginx--静态资源服务器系列随笔,我想探讨以下几个问题: Nginx作为静态资源服务器,有什么优势? Nginx如何和tomcat结合起来使用? Nginx如何搭建CDN? 等等 静态资源是指非服务器运行动态生成的文件,主要包括浏览器端渲染(html.css.js).图片

使用node搭建静态资源服务器(2)

在上一篇使用node搭建静态资源服务器(1)中,我们已经实现了基本的功能,下面继续实现进阶功能. 静态资源的压缩 //compress.js module.exports = (rs,req,res) => { const acceptEncoding = req.headers['accept-encoding']; if(!acceptEncoding || !acceptEncoding.match(/\b(gzip|defalte)\b/)) { return rs; }else if(