基於aws api gateway的asp.net core驗證

来源:https://www.cnblogs.com/axzxs2001/archive/2019/03/12/10515644.html
-Advertisement-
Play Games

本文是介紹aws 作為api gateway,用asp.net core用web應用,.net core作為aws lambda function。 ...


本文是介紹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  
View Code

發佈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功能請參考官方文檔。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天工作中遇到了一個情景: 前端向後臺發送一個請求,希望後臺返回一組數據,由於後臺返回的數據量很大,希望儘可能壓縮響應的大小 我的想法:後臺將數據(Short的數組)直接轉換成Byte[] 然後將byte[]發送至前端。 傳統的Json是將數據序列化成Json文件在發送到前端,這樣做的好處是處理簡單 ...
  • 系統:WIndows 10 工具:Visual Studio 2017 在寫代碼的過程中,我遇到了這樣的一個問題。如圖 vs錯誤提示是在SqlHelper中有錯,可是怎麼改都不能解決問題。 最後發現是前端往後端傳數據的時候,多寫了一個Id,如圖 在下麵編號中我已經回傳了一個Id的值,就不再需要一個h ...
  • ASP.NET Core 身份驗證及鑒權 目錄 + 項目準備 + 身份驗證 定義基本類型和介面 編寫驗證處理器 實現用戶身份驗證 + 許可權鑒定 思路 編寫過濾器類及相關介面 實現屬性註入 實現用戶許可權鑒定 + 測試 環境 + VS 2017 + ASP.NET Core 2.2 目標 以相對簡單優雅 ...
  • 昨天看碼雲上有兩個項目感覺很好, 可惜竟然不會Git 找了很久看了好多文檔看他寫的都好複雜啊! 在這我給寫出來一點點 1.下載Git https://git-scm.com/download/win 安裝 64-bit Git for Windows Setup. 這個版本。 2.在所需要下載的文件 ...
  • Electron.Net(結合Asp.Net Core)初次使用 ...
  • 最近在研究串口通訊,其中有幾個比較重要的概念,RS-232這種適配於上位機和PC端進行連接,RS-232只限於PC串口和設備間點對點的通信。它很簡單的就可以進行連接,由於串口通訊是非同步的,也就是說你可以同時向兩端或者更多進行數據發送,它們之間的傳輸數據類型是byte,串口通信最重要的參數是波特率、數 ...
  • 拋出C#異常 在大多數情況下,您不需要關心ServiceStack的錯誤處理,因為它為拋出C#異常的正常用例提供本機支持,例如: HTTP錯誤C#異常的預設映射 預設C#例外: ArgumentException使用HTTP StatusCode為400 BadRequest返回繼承 NotImpl ...
  • appsettings.json是什麼? 相信大家在.Net Framework的項目都會用的web.config,app.config這些文件,appsettings.json文件就是Asp.Net Core中代替這些config文件的一個,它支持更靈活的數據結構 好,現在我們添加一個參數,然後通 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...