三 Web API 授权方式

web api的客户端,包括 android,ios,h5,自然对访问权限要加上授权机制。对于h5,要求把h5站点和web api部署在同一个域名下,然后对web api 配置为禁止跨域访问。而对 android 和 ios 等app端访问,则参考微信的签名验证方式,在请求url后面加上

时间戳,随机字符串,以及加密后的签名。下面主要就app端授权实现代码说明一下。

1 首先 定义一个 KEY,随便自己定义,我这里直接取一个guid,你可以存放在数据库,也可以存config文件,也可以直接在代码里 const定义。我这里放在config。

  <appSettings>
<add key="AppKey" value="254d-4eaa-85f4-a92ff4c08042" />
</appSettings>

2 实现一个特性类,继承自.net自带的AuthorizationFilterAttribute。

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class ApiAuthFilterAttribute : AuthorizationFilterAttribute
{
。。。。
}
AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)的意思 很容易理解,即当前访问授权验证可以用在整个controller(class),也可以用在某个web api(method)上。
这个类里面,重点是重载 OnAuthorization方法。方法里的actionContext参数是一个微软针对api请求的做了一些封装改进的一个请求上下文,里面包含了api 请求参数等信息,可惜缺乏我想要的header里的参数。
我们和app端约定把授权相关参数放在header里面,还有后面一些有关api版本的参数等都放在header里,放在header里安全性更高一些,而且对于app端封装http请求也更简单。为了从actionContext得到普通的HttpContext对象,
转换代码:HttpRequestBase request = (actionContext.Request.Properties["MS_HttpContext"] as HttpContextBase).Request;
    public override void OnAuthorization(HttpActionContext actionContext)
{ base.OnAuthorization(actionContext);
// 允许匿名访问
if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Count > )
{
return;
} HttpRequestBase request = (actionContext.Request.Properties["MS_HttpContext"] as HttpContextBase).Request;

拿到了request,可以通过

string signature = request.Headers["signature"];
string timestamp = request.Headers["timestamp"];
string nonce = request.Headers["nonce"];
result = CheckSignature(signature, timestamp, nonce);

进行授权验证

对于需要进行授权的web api      
        [HttpGet]
[ApiAuthFilter]
public ApiResult GetShopQRCodeList()
{
。。。
}

3 对于用户身份识别,我们使用了token机制。即用户登录成功后分配一个token(采用guid)给到客户端。当客户端在请求的header里携带了token时,我们就可以根据token识别当前请求的用户。在数据库里设计了token表,记录用户登录时间,登录设备(h5,app,微信公众号等),token值等,相当于cookie,用于控制用户免密码登录,以及可以同时登录几种设备等。


电商系统架构总结3(webapi授权机制)的更多相关文章

  1. 电商系统架构总结1(EF)

    最近主导了一个电商系统的设计开发过程,包括前期分析设计,框架搭建,功能模块的具体开发(主要负责在线支付部分),成功上线后的部署维护,运维策略等等全过程. 虽然这个系统不是什么超大型的电商系统 数亿计的 ...

  2. 电商系统架构总结4(webapi 版本控制)

    为了 顺利迭代升级,web api 在维护过程是不断升级的,但用户是不能强迫他们每次都跟随你去升级,这样会让用户不胜其烦.为了保证不同版本的客户端能同时兼容,在web api接口上加入版本控制就很有必 ...

  3. 电商系统架构总结2(Redis)

    二  Redis缓存 考虑到将来服务器的升级扩展,使用redis代替.net内置缓存是比较理想的选择.redis是非常成熟好用的缓存系统,安装配置非常简单,直接上官网下载安装包 安装启动就行了. 1 ...

  4. 电商系统的演变可以看出架构演变 Dubbo入门 远程过程调用 需要解决的问题

    Dubbo入门---搭建一个最简单的Demo框架 - CSDN博客 https://blog.csdn.net/noaman_wgs/article/details/70214612 Dubbo背景和 ...

  5. 属性 每秒10万吞吐 并发 架构 设计 58最核心的帖子中心服务IMC 类目服务 入口层是Java研发的,聚合层与检索层都是C语言研发的 电商系统里的SKU扩展服务

    小结: 1. 海量异构数据的存储问题 如何将不同品类,异构的数据统一存储起来呢? (1)全品类通用属性统一存储: (2)单品类特有属性,品类类型与通用属性json来进行存储: 2. 入口层是Java研 ...

  6. 免费领CRMEB移动社交电商系统源码与授权

    移动电商风起云涌,直播带货重塑销售模式,传统商业更是举步维艰,各行各业转型移动电商迫在眉睫,拥有一款好的移动社群社交电商系统成为众多企业与商家的心病! 你曾是否被那些劣质的移动电商系统搞得心力憔悴? ...

  7. 通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权

    Oauth2授权,熟悉微信开发的同学对这个东西应该不陌生吧.当我们的应用系统需要集成第三方授权时一般都会做oauth集成,今天就来看看在Dapr的语境下我们如何仅通过配置无需修改应用程序的方式让第三方 ...

  8. 集DDD,TDD,SOLID,MVVM,DI,EF,Angularjs等于一身的.NET(C#)开源可扩展电商系统–Virto Commerce

    今天一大早来看到园友分享的福利<分享一个前后端分离方案源码-前端angularjs+requirejs+dhtmlx 后端asp.net webapi>,我也来分享一个吧.以下内容由笔者写 ...

  9. SpringBoot+Security+MyBatis+ES+MQ+Redis+Docker+Vue的电商系统

    今天鹏哥给大家推荐的项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现. 前台商城系统包含首页门户.商品推荐.商品搜索.商品展示.购物车.订单流程.会员中 ...

随机推荐

  1. resolve和reject不会终结Promise的参数函数的执行

  2. js 的深拷贝

    出处:https://www.cnblogs.com/Chen-XiaoJun/p/6217373.html function deepClone(initalObj, finalObj) { var ...

  3. Java锁的选择

    1.synchronized: 当只有少量竞争者.synchronized不会引发死锁 2.ReentrantLock:竞争者不少,但是趋势可以预估.使用不当,可能造成死锁.

  4. Go thrift使用举例

    thrift 最初是 facebook 开发使用的 rpc 通信框架,后来贡献给了 apache 基金会,出来得比较早,几乎支持所有的后端语言,使用非常广泛,是不可不知的一个网络框架. 和 grpc ...

  5. c# 一些细节

    1.动态对象和匿名对象偶然看到一个语法,觉得特别方便然后频繁使用,但是没有深究,直到今天忽然发现我潜意思中对它的认知居然是错误的. var data=new { State=1,Message=&qu ...

  6. Hanlp等七种优秀的开源中文分词库推荐

    Hanlp等七种优秀的开源中文分词库推荐 中文分词是中文文本处理的基础步骤,也是中文人机自然语言交互的基础模块.由于中文句子中没有词的界限,因此在进行中文自然语言处理时,通常需要先进行分词. 纵观整个 ...

  7. spring boot打jar包(maven对jar和lib分离)

    spring boot intellij Ide打包有两种方式: 1.maven:熟悉.方便配置灵活 2.Build artifacts:操作比较复杂,jar和lib包分离 重点讲maven如何支持j ...

  8. 银行卡所属公司判断 参考自https://blog.csdn.net/well2049/article/details/79429130

    在网上找到了一个银行卡的验证,通过阿里的支付宝接口进行校验,能够准确识别是否存在,归属行,卡号类型是储蓄卡(DC)还是信用卡(CC). 接口api:需要传入的2个参数,卡号cardNo和cardBin ...

  9. 计算MySQL的内存峰值公式 (转)

    -- 计算MySQL的内存峰值公式,计算所有的连接满了的情况下: select (@@key_buffer_size + @@query_cache_size + @@tmp_table_size   ...

  10. jQuery自定义扩展写法

    jQuery自定义扩展有两种写法: $.extend({}) ;           调用方法:      $.方法          $.fn.extend({});        调用方法:    ...