栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

保护我方Id | ASP.NET Core Web API使用加密Id

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

保护我方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
{
    Hashids hashids = new Hashids("公众号My IO");//加盐
    public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var str = JsonSerializer.Deserialize(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 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。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/306039.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号