用以太坊区块链和jwt token保证Asp.Net Core的API交互安全(上)
去中心化应用程序(DApp)的常见设计不仅依赖于以太坊区块链,还依赖于API层。在这种情况下,DApp通过用户的以太坊帐户与智能合约进行交互,并通过交换用户凭据而发布的JWT token与API层进行交互。
目标是使用以太坊帐户作为用户凭据来请求JWT Token。
最简单的方法可能是请求用户使用其他随机生成的数据在以太坊上进行交易,然后在发出JWT之前检查交易和随机数据。这种方法有几个副作用:
- 1.用户必须进行交易并支付gas以进行简单的身份验证。
- 2.用户必须等待12-120秒(基于耗费的gas)才能完成身份验证过程。
- 3.每个用户的所有登录操作在以太坊区块链上变得不可公开。
这种方式不实用,并且有一些用户体验限制,我们需要一种方法让用户证明他拥有与他想要用来登录的帐户相关的私钥,而不是只(当然)要求私钥,而不管他是否进行交易。
解决方案
Metamask团队成员Dan Finlay的这篇文章向我启发了本教程。基本上,你的DApp可以提示用户使用他的私钥对短信进行签名。此签名操作不会生成交易,并且它由Metamask附加组件透明地处理(顺便说一句,你的帐户需要解锁)。签名后,帐户,消息和签名将发送到API Token endpoint。验证方法首先通过接受签名和明文消息作为输入的函数从签名中推断帐户(也称为公钥)。如果计算的以太坊地址等于用户提供的帐户,则为该帐户发出JWT Token。
请务必注意,整个身份验证流程不需要用户名/密码或OAuth外部服务。用于验证用户身份的机制与以太坊用于保证以太坊区块链安全性的机制相同。这要归功于Go ethereum(Geth)通过Metamask插件提供JSON RPC中的web3.personal.sign
。
服务器端调用对应的JSON RPC以从签名中检索帐户:web3.personal.ecrecover
。在本教程中,我们将构建一个Asp.Net Core 2项目作为API层,并构建一个简单的HTML/javascript客户端作为DApp,以实际演示此身份验证过程。
- 1.从DApp用户单击登录按钮。这需要Metamask提供的web3对象。
- 2.Metamask要求用户通过JSON RPC的
web3.personal.sign
签署消息。 - 3.签名将发送到API层,该层通过JSON RPC的
web3.personal.ecrecover
验证帐户。 - 4.验证后,API层将发布JWT。
先决条件
- 1.为Chrome或Firefox安装Metamask插件。这个附加组件“将以太坊带到你的浏览器上”。实际上,Metamask提供了一个web3对象,用于与你的DApp中的以太坊区块链进行交互,处理你的私钥并在浏览器中管理交易。
- 2.可选的。运行Geth节点。我将向你展示两种从签名中恢复以太坊帐户的方法,其中一种方法需要你的API层针对Geth节点调用JSON RPC。注意:Infura现在还不行,因为它们不允许大多数
web3.personal.*
的JSON RPC接口。出于开发目的,运行Geth节点非常简单。在生产环境中,出于安全考虑,运行Geth节点并不是一项简单的任务。最好的方法是依靠AWS或Azure提供的区块链即服务堆栈(BaaS)。 - 3.开发堆栈:Visual Studio 2017和节点包管理器(NPM)。
- 4.以太坊/Asp.Net核心/前端开发的基础知识,JWT认证流程的基础知识。
开始
打开Visual Studio 2017,创建EthereumJwtSolution
并添加两个Asp.Net Core 2 Web应用程序项目:EthereumJwtApi
和EthereumJwtClient
。为两个项目选择空项目脚手架。
EthereumJwtClient
只是一个HTML/Javascript客户端。我们将在Asp.Net Core上构建客户端应用程序,只是为了在IIS Express上轻松运行它。
我们需要准备EthereumJwtApi
来创建和处理JWT token,以保护一些安全端点。任务很简单,因为Asp.Net Core 2有一个内置的JWT机制,可以插入我们的应用程序。 打开Startup.cs并修改ConfigureServices
方法:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>{options.TokenValidationParameters = new TokenValidationParameters{ValidateIssuer = true,ValidateAudience = true,ValidateLifetime = true,ValidateIssuerSigningKey = true,ValidIssuer = Configuration["Jwt:Issuer"],ValidAudience = Configuration["Jwt:Audience"],IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))};});services.AddCors(options =>{options.AddPolicy("CorsPolicy",builder => builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader().AllowCredentials().Build());});services.AddMvc();
然后修改Configure
方法:
if (env.IsDevelopment())
{app.UseDeveloperExceptionPage();
}app.UseCors("CorsPolicy");app.UseAuthentication();app.UseMvc();
我们告诉我们的API应用程序使用JWT身份验证服务。为了与我们的用户合作,我们还需要配置Cors策略。我们在appsetting.json
中定义设置JWT配置:
"Jwt": {"Key": "averysecretpassphrase", // A random and secure passhphrase"Issuer": "http://localhost:49443/", // This API base URI"Audience": "http://localhost:51149/" // The client base URI},
为测试目的创建一个简单的可能安全端点:
[Route("api/[controller]")]
public class ValuesController : Controller
{// GET api/values[HttpGet, Authorize]public IEnumerable<string> Get(){return new string[] { "Secret 1", "Secret 2" };}
}
TokenController.cs
将处理JWT请求和相关的token问题:
[Route("api/[controller]")]
public class TokenController : Controller
{private IConfiguration _config;public TokenController(IConfiguration config){_config = config;}[AllowAnonymous][HttpPost]public async Task<IActionResult> CreateToken([FromBody]LoginVM login){var user = await Authenticate(login);if (user != null){var tokenString = BuildToken(user);return Ok(new { token = tokenString });}return Unauthorized();}private string BuildToken(UserVM user){var claims = new[] {new Claim(JwtRegisteredClaimNames.Sub, user.Account),new Claim(JwtRegisteredClaimNames.GivenName, user.Name),new Claim(JwtRegisteredClaimNames.Email, user.Email),new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())};var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);var token = new JwtSecurityToken(_config["Jwt:Issuer"],_config["Jwt:Audience"],claims,expires: DateTime.Now.AddMinutes(30),signingCredentials: creds);return new JwtSecurityTokenHandler().WriteToken(token);}private async Task<UserVM> Authenticate(LoginVM login){// TODO: this method will authenticate the user recovering the Ethereum address from signature using the Geth RPC web3.personal.ecrecover APIUserVM user = user = new UserVM { Account = login.Account, Name = string.Empty, Email = string.Empty };return user;}private async Task<UserVM> Authenticate2(LoginVM login){// TODO: This method will authenticate the user recovering his Ethereum address through underlaying offline ecrecover method.UserVM user = user = new UserVM { Account = login.Account, Name = string.Empty, Email = string.Empty };return user;}
这是一个典型的JWT控制器,核心方法,Authenticate
和Authenticate2
尚未实现。一旦实现,他们将完成相同的工作:从签名中恢复以太坊地址,并检查它是否等于客户端提供的以太坊地址。
LoginVM
表示客户端提供的用户凭据,UserVM
表示“服务器端”登录用户:
public class LoginVM
{public string Signer { get; set; } // Ethereum account that claim the signaturepublic string Signature { get; set; } // The signaturepublic string Message { get; set; } // The plain messagepublic string Hash { get; set; } // The prefixed and sha3 hashed message
}public class UserVM
{public string Account { get; set; } // Unique account name (the Ethereum account)public string Name { get; set; } // The user namepublic string Email { get; set; } // The user Email
}
Authenticate
方法将Signature
和Message
属性作为ecRecover
函数的输入,Authenticate2
方法将采用Signature
和Hash
属性。我稍后会解释其中的差异。
======================================================================
分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:
- java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
- python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
- php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
- 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
- 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
- C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
- EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
- java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
- php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
汇智网原创翻译,转载请标明出处。这里是以太坊 区块链 Asp.Net Core API
转载于:https://blog.51cto.com/13697184/2310496
用以太坊区块链和jwt token保证Asp.Net Core的API交互安全(上)相关推荐
- 用以太坊区块链保证Asp.Net Core的API安全(上)
去中心化应用程序(DApp)的常见设计不仅依赖于以太坊区块链,还依赖于API层.在这种情况下,DApp通过用户的以太坊帐户与智能合约进行交互,并通过交换用户凭据而发布的JWT token与API层进行 ...
- EOS区块链和以太坊区块链那个更好?
显然,你已经听说过两个最受欢迎的智能合约区块链,但想知道EOS与以太坊之中哪个更好?或许你想比较一下两种技术?好吧,你来对了地方,因为我要告诉你你需要知道的一切! 在这个EOS vs Ethereum ...
- 谈谈区块链入门技能(二):以太坊区块链浏览器如何使用?
上一期我们介绍了比特币浏览器如何使用,本期我们来谈一谈什么是以太坊以及以太坊浏览器如何使用. 什么是以太坊? 以太坊是一个合作运行的.全球性的.透明的数据库.通过共同努力,来自世界各地的参与者维护了以 ...
- 以太坊区块链浏览器(二)开发
以太坊区块链浏览器开发,包括合约信息及链上信息展示,web3j的对应API. 更多区块链技术与应用分类: 区块链应用 区块链开发 以太坊 | Fabric | BCOS | 密码技术 | 共识算 ...
- 尚硅谷以太坊区块链学习之NFT智能合约(6)
尚硅谷以太坊区块链学习之NFT智能合约(6) 前言 一.NFT智能合约 1.智能合约代码 2.智能合约推送 3.具体调用 二.具体使用 三.NFT商家智能合约 前言 提示:服务外包区块链学习 5被ba ...
- 【区块链】以太坊区块链技术初探
2019独角兽企业重金招聘Python工程师标准>>> [国内首家]以太坊区块链实战教学:http://edu.csdn.net/course/detail/6455 LinApex ...
- 以太坊区块链同步_以太坊69:如何在10分钟内建立完全同步的区块链节点
以太坊区块链同步 by Lukas Lukac 卢卡斯·卢卡奇(Lukas Lukac) Ethereu M 69:如何在10分钟内建立完全同步的区块链节点 (Ethereum 69: how to ...
- 以太坊区块链_以太坊区块链搭建与使用(一)-私有链
步骤 一.下载go语言,并配置环境变量 //以太坊源代码依赖的编译与运行环境 二.通过git clone以太坊源码(go-ethereum),并编译 一.go安装 step1:下载 官方(一般打不开) ...
- 如何搭建socks5和ss节点_以太坊区块链搭建与使用(三)-联盟链
首先对以下概念说明下: 一.以太坊大家都知道比特币使用的技术是区块链技术,比特币也是区块链技术的代表. 即比特币=区块链1.0随着区块链技术的发展以太坊也诞生了,也就是我们说的 区块链2.0.为什么说 ...
- 如何用web3.js在以太坊区块链上保存数据?
2019独角兽企业重金招聘Python工程师标准>>> 虽然有北大博士讲,95%的区块链项目都没有前途,但我们知道区块链还是有它的优势,比如数据的不可篡改性对于版权保护有相当大的意义 ...
最新文章
- 阅读笔记 CCL: Cross-modal Correlation Learning with Multi-grained Fusion by Hierarchical Network
- linux 11G R2 RAC 配置NTP服务器
- Java -- JDBC 学习--通过 ResultSet 执行查询操作
- 【Paper】2012_Distributed Average Tracking of Multiple Time-Varying Reference Signals With Bounded
- gradle转maven
- 数据结构(2) -- 线性表的顺序表示
- Java中方法参数的传递
- axios.delete()请求方式(含代码)- 应用篇
- 使用as3控制动画的播放与暂停
- now is all
- jQuery获取表单数据
- 【解决方案】macOS 打开微信视频电话其他应用音量变小问题
- 电脑上传,提高电脑上传速度 怎么提高文件上传速度
- (含Matlab源码)算术编码(arithmetic coding)的underflow问题
- 摄像头拍摄距离、镜头参数、物体大小之间的关系
- excel2007整体调整行间距
- 统计学基于matlab,MATPLOT:一款基于MATLAB的地球化学数据分析成图软件
- iOS 12+ ReplayKit 系统录屏(一)
- 【测试工具】-性能测试-GT学习笔记
- Notepad++装JsonViewer插件