前言

上次,我们介绍了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相关推荐

  1. 用JWT来保护我们的ASP.NET Core Web API

    在用Middleware给ASP.NET Core Web API添加自己的授权验证 中,自己动手写了一个Middleware来处理API的授权验证,现在就采用另外一种方式来处理这个授权验证的问题,毕 ...

  2. 【壹刊】Azure AD 保护的 ASP.NET Core Web API (下)

    一,引言 上一节讲到如何在我们的项目中集成Azure AD 保护我们的API资源,以及在项目中集成Swagger,并且如何把Swagger作为一个客户端进行认证和授权去访问我们的WebApi资源的?本 ...

  3. ASP.NET Core Web API下事件驱动型架构的实现(四):CQRS架构中聚合与聚合根的实现

    在前面两篇文章中,我详细介绍了基本事件系统的实现,包括事件派发和订阅.通过事件处理器执行上下文来解决对象生命周期问题,以及一个基于RabbitMQ的事件总线的实现.接下来对于事件驱动型架构的讨论,就需 ...

  4. 如何测试ASP.NET Core Web API

    在本文中,我们将研究如何测试你的ASP .NET Core 2.0 Web API解决方案.我们将了解使用单元测试进行内部测试,使用全新的ASP .NET Core的集成测试框架来进行外部测试. 本文 ...

  5. 针对ASP.NET Core Web API的先进架构

    \ 本点要点 \\ 与传统的ASP.NET相比,ASP.NET Core的新架构提供了一些好处\\t ASP.NET Core从一开始就包含对依赖注入的支持\\t 单一职责原则简化了实施和设计.\\t ...

  6. ASP.NET Core Web APi获取原始请求内容

    前言 我们讲过ASP.NET Core Web APi路由绑定,本节我们来讲讲如何获取客户端请求过来的内容. ASP.NET Core Web APi捕获Request.Body内容 [HttpPos ...

  7. 重温.NET下Assembly的加载过程 ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线...

    重温.NET下Assembly的加载过程 最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后发现 ...

  8. ASP.NET Core Web API 与 SSL

    SSL 一直没有真正研究过SSL,不知道下面的理解是否正确. SSL是Secure Sockets Layer的缩写,它用来保护服务器和客户端之前的通信.它是基于信任+加密的概念. 在介绍SSL的原理 ...

  9. 如何使用ASP.NET Core Web API实现短链接服务

    前言 在前面的文章中,我们介绍了hashids.net,可以将数值型Id加密成无意义的字符串. 今天,我们来利用这一特点,实现短链接服务. 原理 短链接,顾名思义就是在形式上比较短的链接网址.借助短链 ...

最新文章

  1. java自定义上下文对象_Java框架_Spring应用上下文对象加载配置
  2. samtools merge_【生信工具】Samtools 安装与使用 | “十年以后,工具难免沦为朋友”...
  3. 阿里新财报霸道惨了!菜鸟加速全球72小时必达,世界都沸腾!
  4. CentOS7性能监控系统安装
  5. 在Linux系统下如何运行notes客户端
  6. Matlab | Matlab从入门到放弃(14)——基于Matlab的多变量数据分析
  7. .NET 指南:转换操作符
  8. 数组竟然可以这样定义
  9. LCA在线算法ST算法
  10. 解决ueditor中没法动态配置imageurlprefix的方法
  11. 【读书笔记】—— 《从 0 到 1》
  12. 特大喜讯!鸿蒙项目来了:在线电子词典
  13. java struts validate_重写ActionForm中的Validate()方法
  14. OSChina 周五乱弹 ——什么样的工作每天都有艳遇
  15. Android-安卓Canvas画小黄人
  16. 洛谷P1789 【Mc生存】插火把
  17. 雅思大作文写作--Cities
  18. 使用xmanager打开远程桌面
  19. Android 获得联系人并排序
  20. Java11 ZGC 和 Java12 Shenandoah 介绍:苟日新、日日新、又日新

热门文章

  1. Tcp连接的七次握手浅析
  2. 简述JQuery,Extjs,YUI,Prototype,Dojo等JS框架的区别和应用场景
  3. Nginx实用指南V1 (连载之六:cacti监控)
  4. qemu+linux+x86+64,kvm 内部错误:无法找到适合 x86_64 的模拟器
  5. IPC之——消息队列
  6. MFC 单选按钮Radio使用注意
  7. boost asio resolver
  8. pullToRefresh下拉刷新上拉加载
  9. 在Marketplace上销售应用【WP7学习札记之十八】
  10. java注解类型_Java注解类型