保护我方Id | ASP.NET Core Web API使用加密Id
Posted Archy_Wang_1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了保护我方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。
以上是关于保护我方Id | ASP.NET Core Web API使用加密Id的主要内容,如果未能解决你的问题,请参考以下文章
保护我方Id | ASP.NET Core Web API使用加密Id
Asp.net core 3.1 保护 API 和 Web 应用程序
使用 MSAL 保护 ASP.Net Core Web API 和 Angular App
如何保护 ASP.NET Core Web API 免受被盗 JWT 令牌以进行模拟