保护我方Id | ASP.NET Core Web API使用加密Id
前言
上次,我们介绍了hashids.net
,可以将数值型Id加密成无意义的字符串,但是通过这些字符串又可以反向映射出真实的Id以供内部使用。比如B站的播放链接https://www.bilibili.com/video/BV1xK4y1VXXX
应该就是这种实现方式。
但是,我们希望在ASP.NET Core Web API实现中使用的还是真实的数值型Id,方便操作;而在对外输入/输出时对Id进行自动加解密转换,保证安全。
类似这样:
//请求
http://xxx.com/user/WwYQ//id=12345
public UserDto Get(int id)
那么,应该如何实现呢?
自定义序列化
在输出时,我们需要自动加密Id。
在这里,通过编写一个自定义JsonConverter来实现:
public class HashIdJsonConverter : JsonConverter<int>
{Hashids hashids = new Hashids("公众号My IO");//加盐public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options){var str = JsonSerializer.Deserialize<string>(ref reader, options);return hashids.Decode(str)[0];}public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options){JsonSerializer.Serialize(writer, hashids.Encode(value), options);}
}
运行程序,发现我们的Id被正常加密:
public class UserDto
{[JsonConverter(typeof(HashIdJsonConverter))]public int Id { get; set; }public string Name { get; set; }
}[HttpGet]
public IEnumerable<UserDto> Get()
{return new[] { new UserDto { Id = 12345, Name = "用户12345" } };
}
自定义模型绑定
在输入时,我们需要自动解密Id。
在这里,通过编写一个自定义IModelBinder来实现:
public class HashIdModelBinder : IModelBinder
{Hashids hashids = new Hashids("公众号My IO");//加盐public Task BindModelAsync(ModelBindingContext bindingContext){var modelName = bindingContext.ModelName;var valueProviderResult = bindingContext.ValueProvider.GetValue(modelName);var str = valueProviderResult.FirstValue;bindingContext.Result = ModelBindingResult.Success(hashids.Decode(str)[0]);return Task.CompletedTask;}
}
运行程序,发现我们的Id被正常解密:
[HttpGet("{id}")]
public UserDto Get([ModelBinder(typeof(HashIdModelBinder))]int id)
{return new UserDto { Id = id, Name = "用户"+id } ;
}
结论
在本文中,通过实现自定义序列化和模型绑定,我们实现了ASP.NET Core Web API使用加密Id,而在内部使用的还是真实的数值型Id。
如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“
保护我方Id | ASP.NET Core Web API使用加密Id相关推荐
- 用JWT来保护我们的ASP.NET Core Web API
在用Middleware给ASP.NET Core Web API添加自己的授权验证 中,自己动手写了一个Middleware来处理API的授权验证,现在就采用另外一种方式来处理这个授权验证的问题,毕 ...
- 【壹刊】Azure AD 保护的 ASP.NET Core Web API (下)
一,引言 上一节讲到如何在我们的项目中集成Azure AD 保护我们的API资源,以及在项目中集成Swagger,并且如何把Swagger作为一个客户端进行认证和授权去访问我们的WebApi资源的?本 ...
- ASP.NET Core Web API下事件驱动型架构的实现(四):CQRS架构中聚合与聚合根的实现
在前面两篇文章中,我详细介绍了基本事件系统的实现,包括事件派发和订阅.通过事件处理器执行上下文来解决对象生命周期问题,以及一个基于RabbitMQ的事件总线的实现.接下来对于事件驱动型架构的讨论,就需 ...
- 如何测试ASP.NET Core Web API
在本文中,我们将研究如何测试你的ASP .NET Core 2.0 Web API解决方案.我们将了解使用单元测试进行内部测试,使用全新的ASP .NET Core的集成测试框架来进行外部测试. 本文 ...
- 针对ASP.NET Core Web API的先进架构
\ 本点要点 \\ 与传统的ASP.NET相比,ASP.NET Core的新架构提供了一些好处\\t ASP.NET Core从一开始就包含对依赖注入的支持\\t 单一职责原则简化了实施和设计.\\t ...
- ASP.NET Core Web APi获取原始请求内容
前言 我们讲过ASP.NET Core Web APi路由绑定,本节我们来讲讲如何获取客户端请求过来的内容. ASP.NET Core Web APi捕获Request.Body内容 [HttpPos ...
- 重温.NET下Assembly的加载过程 ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线...
重温.NET下Assembly的加载过程 最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后发现 ...
- ASP.NET Core Web API 与 SSL
SSL 一直没有真正研究过SSL,不知道下面的理解是否正确. SSL是Secure Sockets Layer的缩写,它用来保护服务器和客户端之前的通信.它是基于信任+加密的概念. 在介绍SSL的原理 ...
- 如何使用ASP.NET Core Web API实现短链接服务
前言 在前面的文章中,我们介绍了hashids.net,可以将数值型Id加密成无意义的字符串. 今天,我们来利用这一特点,实现短链接服务. 原理 短链接,顾名思义就是在形式上比较短的链接网址.借助短链 ...
最新文章
- java自定义上下文对象_Java框架_Spring应用上下文对象加载配置
- samtools merge_【生信工具】Samtools 安装与使用 | “十年以后,工具难免沦为朋友”...
- 阿里新财报霸道惨了!菜鸟加速全球72小时必达,世界都沸腾!
- CentOS7性能监控系统安装
- 在Linux系统下如何运行notes客户端
- Matlab | Matlab从入门到放弃(14)——基于Matlab的多变量数据分析
- .NET 指南:转换操作符
- 数组竟然可以这样定义
- LCA在线算法ST算法
- 解决ueditor中没法动态配置imageurlprefix的方法
- 【读书笔记】—— 《从 0 到 1》
- 特大喜讯!鸿蒙项目来了:在线电子词典
- java struts validate_重写ActionForm中的Validate()方法
- OSChina 周五乱弹 ——什么样的工作每天都有艳遇
- Android-安卓Canvas画小黄人
- 洛谷P1789 【Mc生存】插火把
- 雅思大作文写作--Cities
- 使用xmanager打开远程桌面
- Android 获得联系人并排序
- Java11 ZGC 和 Java12 Shenandoah 介绍:苟日新、日日新、又日新
热门文章
- Tcp连接的七次握手浅析
- 简述JQuery,Extjs,YUI,Prototype,Dojo等JS框架的区别和应用场景
- Nginx实用指南V1 (连载之六:cacti监控)
- qemu+linux+x86+64,kvm 内部错误:无法找到适合 x86_64 的模拟器
- IPC之——消息队列
- MFC 单选按钮Radio使用注意
- boost asio resolver
- pullToRefresh下拉刷新上拉加载
- 在Marketplace上销售应用【WP7学习札记之十八】
- java注解类型_Java注解类型