基于aws api gateway的asp.net core验证

本文是介绍aws 作为api gateway,用asp.net core用web应用,.net core作为aws lambda function。

api gateway和asp.net core的用处不废话,直接上操作步骤。

首先在asw的凭据管理中添加操作的用户和角色,步骤如下:

注意选择的策略名称

下载csv备用

安装aws的visual studio插件

加载备用csv文件

创建asw lambda funcation项目

代码如下:

  1 using System;
  2
  3 using Amazon.Lambda.APIGatewayEvents;
  4
  5 using Amazon.Lambda.Core;
  6
  7 using Microsoft.IdentityModel.Tokens;
  8
  9 using System.Collections.Generic;
 10
 11 using System.IdentityModel.Tokens.Jwt;
 12
 13 using System.Linq;
 14
 15 using System.Security.Claims;
 16
 17 using System.Text;
 18
 19
 20
 21
 22
 23 [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]
 24
 25 namespace API01AWSLambda
 26
 27 {
 28
 29     public class Function
 30
 31     {
 32
 33
 34
 35         /// <summary>
 36
 37         ///验证Token的Lambda函数
 38
 39         /// </summary>
 40
 41         /// <param name="apigAuthRequest">请求</param>
 42
 43         /// <param name="context">上下文</param>
 44
 45         /// <returns></returns>
 46
 47         public APIGatewayCustomAuthorizerResponse FunctionHandler(APIGatewayCustomAuthorizerRequest apigAuthRequest, ILambdaContext context)
 48
 49         {
 50
 51             LambdaLogger.Log($"AWS Lambda函数验证Token开始");
 52
 53             var TokenValidationParameters = new TokenValidationParameters
 54
 55             {
 56
 57                 ValidateIssuer = true,
 58
 59                 ValidateIssuerSigningKey = true,
 60
 61                 ValidIssuer = SecurityConstants.Issuer,
 62
 63                 ValidateAudience = true,
 64
 65                 ValidAudience = SecurityConstants.Audience,
 66
 67                 ValidateLifetime = true,
 68
 69                 IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(SecurityConstants.SecurityKey)),
 70
 71                 ClockSkew = TimeSpan.Zero,
 72
 73             };
 74
 75             var authorized = false;
 76
 77             //删除Bearer再来验证
 78
 79             var token = apigAuthRequest.AuthorizationToken?.Replace("Bearer ", "");
 80
 81             if (!string.IsNullOrWhiteSpace(token))
 82
 83             {
 84
 85                 try
 86
 87                 {
 88
 89                     SecurityToken validatedToken;
 90
 91                     var handler = new JwtSecurityTokenHandler();
 92
 93                     var user = handler.ValidateToken(token, TokenValidationParameters, out validatedToken);
 94
 95                     var claim = user.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name);
 96
 97                     if (claim != null)
 98
 99                     {
100
101                         authorized = claim.Value == SecurityConstants.ClaimName;
102
103                     }
104
105                 }
106
107                 catch (Exception ex)
108
109                 {
110
111                     LambdaLogger.Log($"Error occurred validating token: {ex.Message}");
112
113                 }
114
115             }
116
117             var policy = new APIGatewayCustomAuthorizerPolicy
118
119             {
120
121                 Version = "2012-10-17",
122
123                 Statement = new List<APIGatewayCustomAuthorizerPolicy.IAMPolicyStatement>(),
124
125
126
127             };
128
129             policy.Statement.Add(new APIGatewayCustomAuthorizerPolicy.IAMPolicyStatement
130
131             {
132
133                 Action = new HashSet<string>(new string[] { "execute-api:Invoke" }),
134
135                 Effect = authorized ? "Allow" : "Deny",
136
137                 Resource = new HashSet<string>(new string[] { apigAuthRequest.MethodArn })
138
139
140
141             });
142
143             var contextOutput = new APIGatewayCustomAuthorizerContextOutput();
144
145             contextOutput["User"] = authorized ? SecurityConstants.ClaimName : "User";
146
147             contextOutput["Path"] = apigAuthRequest.MethodArn;
148
149             LambdaLogger.Log($"AWS Lambda函数验证Token结束");
150
151             return new APIGatewayCustomAuthorizerResponse
152
153             {
154
155                 PrincipalID = authorized ? SecurityConstants.ClaimName : "User",
156
157                 Context = contextOutput,
158
159                 PolicyDocument = policy,
160
161             };
162
163         }
164
165     }
166
167     /// <summary>
168
169     /// 测试用,正式环境可以放在云配置中
170
171     /// </summary>
172
173     public class SecurityConstants
174
175     {
176
177         public const string Issuer = "gsw";
178
179         public const string SecurityKey = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
180
181         public const string Audience = "everone";
182
183         public const string Password = "111111";
184
185         public const string ClaimName = "gsw";
186
187     }
188
189 }
190
191  

发布asw lambda funcation

选择创建的asw角色

在管理平台上查看上传的lambda funcation

api gatewayr后台被访问的web api应用有两个:api01,api02,他们最终发布到aws api gateway能访问到的地方,我的api01是:http://helpyou.cloudapp.net:4567/abc,pai02是:http://helpyou.cloudapp.net:4568/abc,源码见https://github.com/axzxs2001/Asp.NetCoreExperiment/tree/master/Asp.NetCoreExperiment/AWS,AuthenticationService项目是用来产生Token的,关于这部门参看我之前的博文。

创建asw api gateway

创建授权

关联api01项目和api02项目的资源文件

给资源添加访问方法,并关联api01的url

添加Token的键Authorzation

添加返回状态码

添加api02的查询参数和header

部署API(如果资源和方法变更后,一定要重新部署API)

复制调用URL(api gateway是有限流的作用的)

本地启动AuthenticationService,用户名gsw,密码111111,这个用户的角色是能访问api01,和api01的

测试访问无token的api01,完整地址是部署的url加上资源名字,结果是401返回码

访问正确token的api02,结果正确返回

更多asw api gateway功能请参考官方文档。

原文地址:https://www.cnblogs.com/axzxs2001/p/10515644.html

时间: 2024-10-02 22:17:12

基于aws api gateway的asp.net core验证的相关文章

Aws api gateway Domain name

Set Up a Custom Domain Name for an API Gateway API The following procedure describes how to set up a custom domain name. To set up a custom domain name for an API Gateway API Sign in to the API Gateway console at https://console.aws.amazon.com/apigat

支持多个版本的ASP.NET Core Web API

基本配置及说明 版本控制有助于及时推出功能,而不会破坏现有系统. 它还可以帮助为选定的客户提供额外的功能. API版本可以通过不同的方式完成,例如在URL中添加版本或通过自定义标头和通过Accept-Header作为查询字符串参数. 在这篇文章中,我们来看看如何支持多版本的ASP.NET Core Web API 创建一个ASP.NET Core Web API应用程序.通过 NuGet 安装此软件包:Microsoft.AspNetCore.Mvc.Versioning,打开Startup.c

ASP.NET CORE API Swagger+IdentityServer4授权验证

简介 本来不想写这篇博文,但在网上找到的文章博客都没有完整配置信息,所以这里记录下. 不了解IdentityServer4的可以看看我之前写的入门博文 Swagger 官方演示地址 源码地址 配置IdentityServer4服务端 首先创建一个新的ASP.NET Core项目. 这里选择空白项,新建空白项目 等待创建完成后,右键单击项目中的依赖项选择管理NuGet程序包,搜索IdentityServer4并安装: 等待安装完成后,下载官方提供的UI文件,并拖放到项目中.下载地址:https:/

asp.net core系列 55 IS4使用Identity密码保护API

原文:asp.net core系列 55 IS4使用Identity密码保护API 一.概述 OAuth 2.0资源(web api)所有者密码授权,允许客户端(Client项目)向令牌服务(IdentityServer项目)发送用户名和密码,并获取代表该用户的访问令牌.在官方文档中讲到:规范通常建议不要使用“资源所有者密码授权”.当用户进行身份验证并请求访问令牌时,使用一个交互式OpenID Connect流程通常要好得多(下篇再了解). 本篇介绍“资源所有者密码授权”是因为这种授权允许我们快

插上腾飞的翅膀:为asp.net core添加protobuf支持

没时间解释了,快上车. 通过NuGet获取Zaabee.AspNetCoreProtobuf Install-Package Zaabee.AspNetCoreProtobuf 在Startup.cs文件中修改ConfigureServices方法 public void ConfigureServices(IServiceCollection services) { services.AddMvc(options => { options.AddProtobufSupport(); }); }

ASP.NET Core 2.2 : 二十七. JWT与用户授权(细化到Action)

上一章分享了如何在ASP.NET Core中应用JWT进行用户认证以及Token的刷新,本章继续进行下一步,用户授权.涉及到的例子也以上一章的为基础.(ASP.NET Core 系列目录) 一.概述 首先说一下认证(authentication)与授权(authorization),它们经常在一起工作,所以有时候会分不清楚.并且这两个英文单词长得也像兄弟.举例来说,我刷门禁卡进入公司,门禁[认证]了我是这里的员工,可以进入:但进入公司以后,我并不是所有房间都可以进,比如“机房重地,闲人免进”,我

Asp.net Core认证和授权:Cookie认证

这里我只是记录下自己在学习中的点滴和一些不懂的地方 Cookie一般是用户网站授权,当用户访问需要授权(authorization)的页面,程序会判断是否已经授权,并认证 添加认证代码:引入命名空间:Microsoft.AspNetCore.Authentication.Cookies; 添加服务 publicvoidConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion

3.介绍ASP.NET Core框架

介绍ASP.NET Core框架 在这篇文章中,我将要向你们简短介绍一下ASP.NET Core 框架.当今社会,当提到软件开发,每个人都是讨论着开源以及跨平台开发.总所周知,微软是以它的基于Windows产品出名的,比如Windows系统,Office办公套件等.现在我们处在新时代软件开发的潮流中,一个新的革命性的产品,被微软推出市场,那就是-----ASP.NET Core.作为本文的一部分,我将详细述说下面几点. ASP.NET的历史 什么是ASP.NET Core ASP.NET Cor

ASP.NET Core原理概述

ASP.NET Core 是一个控制台应用程序,在其 main 方法中创建一个Web服务器,以下是program.cs中的代码: using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; namespace WebApplication5 { public class Program { public static void Main(string[] args) { BuildWebHost(args).Run(); } p