随笔 - 35  文章 - 0  评论 - 121  阅读 - 56623

电商系统架构总结3(webapi授权机制)

三 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 > 0)
            {
                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,用于控制用户免密码登录,以及可以同时登录几种设备等。




posted on   lindping  阅读(511)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示