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();
  }
}

 

转载于:https://www.cnblogs.com/xuannian/p/9708521.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值