• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

asp.netwebapi自定义身份验证

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
/// <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();
  }
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
ASP.NET和Oracle连接问题的解决方法-UnabletoloadDLL(oci.dll)发布时间:2022-07-10
下一篇:
ASP.NETCore2.1使用EFCore操作MySql数据库发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap