当前位置:   article > 正文

WebAPI 用户认证防篡改实现HMAC(四)ApiController_hmac 可以做防篡改吗

hmac 可以做防篡改吗

前面写了三篇文章,都是为了这一步做准备,现在就开始进入最后的正题吧

首先对于用户请求中的合作号和签名部分,定义一个专门的类来接收此部分信息(这里要注意的是,在FromUri获取时,方法里面的参数名不能起属性名一样的参数名,否则会导致类实例化,但属性却均为null的问题,这个在做demo时纠结了我1个多小时,汗一个)

  1. public class PartnerSign
  2. {
  3. public string Partner { get; set; }
  4. public string Sign { get; set; }
  5. }
然后是Controller例子,既然WebAPI创建时,默认自带的例子是Product,那这里也就用Product做例子
  1. public class ProductController : ApiControllerBase
  2. {
  3. [HttpGet]
  4. public IEnumerable<Product> GetAllProducts([FromUri]PartnerSign partnerSign)
  5. {
  6. throw new NotImplementedException();
  7. }
  8. [HttpGet]
  9. public Product GetProduct([FromUri]PartnerSign partnerSign, [FromUri]int id)
  10. {
  11. throw new NotImplementedException();
  12. }
  13. [HttpPost]
  14. public bool AddProduct([FromUri]PartnerSign partnerSign, [FromBody]Product product)
  15. {
  16. throw new NotImplementedException();
  17. }
  18. [HttpPut]
  19. public bool ChangeProduct([FromUri]PartnerSign partnerSign, [FromBody]Product product)
  20. {
  21. throw new NotImplementedException();
  22. }
  23. [HttpDelete]
  24. public bool RemoveProuct([FromUri]PartnerSign partnerSign, [FromUri]int id)
  25. {
  26. throw new NotImplementedException();
  27. }
  28. }
在这里所有的参数我都做了显示声明数据来源,如果不带声明时,对于基础数据,WebAPI默认FromUri,对于实体,WebAPI默认FromBody,另外因为FromUri可以声明多个,所以完全可以将Get请求参数声明为两个,一个为[FromUri]PartnerSign,另一个为其它类,比如[FromUri]OtherClass

再次补充下:对于方法支持的HTTP请求方式(GET,POST,PUT,DELETE),请遵循Restful规范,别搞出新增用PUT、修改用POST、查询用DELETE的事情,虽然这在运行时没有任何错误,但这会导致API实际用意与规范不符

好了,到了这里,简易但完整的WebAPI防篡改就完全实现了,然后……我会在后面再在发一个WebAPI签名测试小工具,方便开发时自测……

忘记补充一个及其重要的事情了:因为签名是通过QueryString方式获取的,所以在API请求时,请求的Url格式必须为?partner=zhangsan&sign=AAFDAFAFA这种格式,即API的Route只能作用到action就结束了,不能Route方法内的参数

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/539708
推荐阅读
  

闽ICP备14008679号