/// <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 = ;
    int.TryParse(content.Request.QueryString["TimeStamp"], out timeStamp);     ApiInfo apiInfo = DB.GetApiInfo(account);
    int nowTimeStamp = Convert.ToInt32(GenerateTimeStamp());     // 无效请求
    if (apiInfo == null || nowTimeStamp - timeStamp > )
    {
      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(, , , , , , );
    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();
  }
}

asp.net webapi 自定义身份验证的更多相关文章

  1. ASP.NET WEBAPI 的身份验证和授权

    定义 身份验证(Authentication):确定用户是谁. 授权(Authorization):确定用户能做什么,不能做什么. 身份验证 WebApi 假定身份验证发生在宿主程序称中.对于 web ...

  2. asp.net mvc 自定义身份验证

    1.定义身份实体对象 /// <summary> /// 网站用户实体对象 /// </summary> public class DDTPrincipal : IPrinci ...

  3. asp.net mvc 自定义身份验证 2

    控制成员角色 [Authorize(Rroles="Administator,SuperAdmin")] public class StoreManagerController:C ...

  4. 关于WEB Service&WCF&WebApi实现身份验证之WebApi篇

    之前先后总结并发表了关于WEB Service.WCF身份验证相关文章,如下: 关于WEB Service&WCF&WebApi实现身份验证之WEB Service篇. 关于WEB S ...

  5. ASP.NET Web API身份验证和授权

    英语原文地址:http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-a ...

  6. 关于WEB Service&WCF&WebApi实现身份验证之WCF篇(2)

    因前段时间工作变动(换了新工作)及工作较忙暂时中断了该系列文章,今天难得有点空闲时间,就继续总结WCF身份验证的其它方法.前面总结了三种方法(详见:关于WEB Service&WCF& ...

  7. 采用Asp.Net的Forms身份验证时,非持久Cookie的过期时间会自动扩展

    问题描述 之前没有使用Forms身份验证时,如果在登陆过程中把HttpOnly的Cookie过期时间设为半个小时,总会收到很多用户的抱怨,说登陆一会就过期了. 所以总是会把Cookie过期时间设的长一 ...

  8. 也谈Asp.net 中的身份验证

    钱李峰 的这篇博文<Asp.net中的认证与授权>已对Asp.net 中的身份验证进行了不错实践.而我这篇博文,是从初学者的角度补充了一些基础的概念,以便能有个清晰的认识. 一.配置安全身 ...

  9. ASP.NET中的身份验证有那些?你当前项目采用什么方式验证请解释

    ASP.NET身份验证模式包括Windows.Forms(窗体).Passport(护照)和None(无). l  Windows身份验证—常结合应用程序自定义身份验证使用使用这种身份验证模式时,AS ...

随机推荐

  1. 同时使用 Ant Design of React 中 Mention 和 Form

    使用场景,在一个列表中,点击每一行会弹出一个表单,通过修改表单数据并提交来修改这一行的数据,其中某个数据的填写需要通过Mention实现动态提示及自动补全的功能. 具体效果为: 遇到的问题: 1.希望 ...

  2. Python内置类型(6)——生成器

    上节内容说到Python的for语句循环本质上就是通过调用Iterable可迭代对象的__iter()__方法获得一个Iterator迭代器对象,然后不断调用Iterator迭代器对象__next() ...

  3. QC内部分享ppt

    Quality Center是一个基于Web的测试管理工具,可以组织和管理应用程序测试流程的所有阶段,包括制定测试需求.计划测试.执行测试和跟踪缺陷.此外,通过Quality Center还可以创建报 ...

  4. Android Systom

  5. C++中返回引用和返回值的区别

    转自https://www.cnblogs.com/JMLiu/p/7928425.html 一.主要讨论下面两个函数的区别: int& at() { return m_data_; } in ...

  6. mybatis教程1(基本使用)

    官方网站 一.什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果 ...

  7. Django学习(5)优雅地分页展示网页

    在我们平时浏览网页时,经常会遇到网页里条目很多的情形,这时就会用到分页展示的功能.那么,在Django中,是如何实现网页分类的功能的呢?答案是Paginator类. 本次分享讲具体展示如何利用Djan ...

  8. DataTable不能通过已删除的行访问该行的信息解决方法

    使用dt.Rows[0]["name", DataRowVersion.Original]可以获取

  9. JavaScript 变量作用域 详解

    变量作用域要点 - 在JavaScript中没有块级作用域,只有函数作用域 - 在函数体内,局部变量的优先级高于同名的全局变量 - 在全局作用域编写代码时可以不写var语句,但声明局部变量时必须使用v ...

  10. canvas-2rect.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...