• asp.net webapi 自定义身份验证


    /// <summary>
    /// 验证
    /// </summary>
    /// Account API账号
    /// TimeStamp 请求时间
    /// Sign 所有请求参数 加密
    public class AuthFilterOutside : AuthorizeAttribute
    {
      //重写基类的验证方式,加入我们自定义的Ticket验证
      public override void OnAuthorization(HttpActionContext actionContext)
      {
        //url获取token
        var content = actionContext.Request.Properties["MS_HttpContext"] as HttpContextBase;
    
        string account = content.Request.QueryString["Account"];
        string sign = content.Request.QueryString["Sign"];
        int timeStamp = 0;
        int.TryParse(content.Request.QueryString["TimeStamp"], out timeStamp);
           
        ApiInfo apiInfo = DB.GetApiInfo(account);
        int nowTimeStamp = Convert.ToInt32(GenerateTimeStamp());
    
        // 无效请求
        if (apiInfo == null || nowTimeStamp - timeStamp > 15)
        {
          HandleUnauthorizedRequest(actionContext);
          return;
        }
        SortedDictionary<string, string> dic = new SortedDictionary<string, string>();
        foreach (string key in content.Request.QueryString.AllKeys)
        {
          if (key != "sign")
          {
            dic.Add(key, content.Request.QueryString[key]);
          }
        }
        string makeSign = GetMakeSign(dic, apiInfo.Token);
        // 签名不正确
        if (sign != makeSign)
        {
          HandleUnauthorizedRequest(actionContext);
          return;
        }
      }
      protected override void HandleUnauthorizedRequest(HttpActionContext filterContext)
      {
        base.HandleUnauthorizedRequest(filterContext);
    
        var response = filterContext.Response = filterContext.Response ?? new HttpResponseMessage();
        response.StatusCode = HttpStatusCode.Forbidden;
        string str = "{"success":"false","message":"服务端拒绝访问:您没有权限!"}";
        response.Content = new StringContent(str, Encoding.UTF8, "application/json");
      }
      public static string GenerateTimeStamp()
      {
        TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
        return Convert.ToInt64(ts.TotalSeconds).ToString();
      }
      /// <summary>
      /// 所有参数 ascii码排序 最后追加Key
      /// </summary>
      /// <param name="dic"></param>
      /// <param name="token"></param>
      /// <returns></returns>
      public string GetMakeSign(SortedDictionary<string, string> dic, string token)
      {
        StringBuilder strBuilder = new StringBuilder();
        foreach (var item in dic)
        {
          strBuilder.AppendFormat("{0}={1}&", item.Key, item.Value);
        }
        strBuilder.AppendFormat("key={0}", token);
    
        var md5 = MD5.Create();
        var bs = md5.ComputeHash(Encoding.UTF8.GetBytes(strBuilder.ToString()));
        var sb = new StringBuilder();
        foreach (byte b in bs)
        {
          sb.Append(b.ToString("x2"));
        }
        //所有字符转为大写
        return sb.ToString().ToUpper();
      }
    }
  • 相关阅读:
    Building fresh packages卡很久
    后端阿里代码扫描
    npm 使用淘宝镜像
    git镜像
    mysql安装8.0.18
    idea2019.2.2版本破解
    JDK下载很慢
    解决GitHub下载速度慢下载失败的问题
    Hashtable多线程遍历问题
    2-18 求组合数 注:代码有问题找不出哪儿错了
  • 原文地址:https://www.cnblogs.com/xuannian/p/9708521.html
Copyright © 2020-2023  润新知