1、token认证

服务端登录成功后分配token字符串。记录缓存服务器,可设置有效期

  1. var token = Guid.NewGuid().ToString().Replace("-", "");
  2. var expire = DateTime.Now.AddHours();
  3. var timespan = ( expire- DateTime.Now);
  4. var key = string.Format("login-{0}", apiRm.Result.UserID);
  5. RedisCacheHelper.SetCacheByKey<string>(key, JsonHelper.ToJson(apiRm.Result), timespan);

通过header传入token后进行服务端认证有效性

  1. curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'token: 1000-e0622f06a9a842a5b79a5295e6d4b235' -d

在controller或action可设置属性是否要验证token

  1. controller:[RoutePrefix("api/Out"), OperateTrack, AuthToken(AuthTypeEnum.Driver)]

    action:[HttpPost, Route("GetOutInfo"),AuthToken(AuthTypeEnum.Driver)]
  2.  
  3. 读取过滤器传过来的信息:
    var user = ControllerContext.RouteData.Values["user"];
    var user1 = HttpContext.Current.User;

创建AuthTokenAttribute继承AuthorizeAttribute

  1. public class AuthTokenAttribute : AuthorizeAttribute
  2. {
  3. public AuthTypeEnum VerifyAuth { get; set; }
  4.  
  5. public AuthTokenAttribute() { this.VerifyAuth = AuthTypeEnum.Common; }
  6.  
  7. public AuthTokenAttribute(AuthTypeEnum verifyAuth)
  8. {
  9. this.VerifyAuth = verifyAuth;
  10. }
  11.  
  12. protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext)
  13. {
  14. var request = actionContext.Request;
  15. if(VerifyAuth== AuthTypeEnum.Driver)
  16. {
  17. var rm= AuthDriver(actionContext);
  18. if (!rm.IsSuccess)
  19. return false;
  20. }
  21. return true;
  22. }
  23.    protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
  24. {
  25. StringBuilder sbMsg = new StringBuilder();
  26. if (VerifyAuth == AuthTypeEnum.Driver)
  27. {
  28. var rm = AuthDriver(actionContext);
  29. if (!rm.IsSuccess)
  30. sbMsg.Append(rm.Message);
  31. }
  32. var content = JsonConvert.SerializeObject(new ResultApiModel { IsSuccess = false, Message = sbMsg.ToString() + ",验证失败,状态:" + (int)HttpStatusCode.Unauthorized, Code = ((int)HttpStatusCode.Unauthorized).ToString() });
  33. actionContext.Response = new HttpResponseMessage
  34. {
  35. Content = new StringContent(content, Encoding.UTF8, "application/json"),
  36. StatusCode = HttpStatusCode.Unauthorized
  37. };
  38. }
  39.  
  40.     private ResultApiModel AuthDriver(System.Web.Http.Controllers.HttpActionContext actionContext)
  41. {
  42. //todo 验证token
  43. //向action传值,在action中可以使用:var user = ControllerContext.RouteData.Values["user"];获取到
  44. actionContext.ControllerContext.RouteData.Values["user"] = v;
  45. SetPrincipal(new UserPrincipal<int>(tokenV));
  46. return ResultApiModel.Create(true);
  47. }
  48. public static void SetPrincipal(IPrincipal principal)
  49. {
  50. Thread.CurrentPrincipal = principal;
  51. //每次都重新覆盖user,避免不同用户对不同action的访问
  52. if (HttpContext.Current != null)
  53. {
  54. HttpContext.Current.User = principal;
  55. }
  56. }
  57. }
  58. public enum AuthTypeEnum
  59. {
  60. Common=,
  61. Driver=
  62. }
  63.  
  64. IPrincipal
  1. public class UserIdentity<TKey> : IIdentity
  2. {
  3. public UserIdentity(IUser<TKey> user)
  4. {
  5. if (user != null)
  6. {
  7. IsAuthenticated = true;
  8. UserID = user.UserID;
  9. LoginNo = user.LoginNo.ToString();
  10. Name = user.LoginNo.ToString();
  11. UserName = user.UserName;
  12. RoleCode = user.RoleCode;
  13. token = user.token;
  14. }
  15. }
  16.  
  17. public string AuthenticationType
  18. {
  19. get { return "CustomAuthentication"; }
  20. }
  21.  
  22. public TKey UserID { get; private set; }
  23.  
  24. public bool IsAuthenticated { get; private set; }
  25.  
  26. public string LoginNo { get; private set; }
  27.  
  28. public string Name { get; private set; }
  29.  
  30. public string UserName { get; private set; }
  31.  
  32. public string RoleCode { get; private set; }
  33.  
  34. public string token { get; private set; }
  35. }
  36.  
  37. public class UserPrincipal<TKey> : IPrincipal
  38. {
  39. public UserPrincipal(UserIdentity<TKey> identity)
  40. {
  41. Identity = identity;
  42. }
  43.  
  44. public UserPrincipal(IUser<TKey> user)
  45. : this(new UserIdentity<TKey>(user))
  46. {
  47.  
  48. }
  49.  
  50. /// <summary>
  51. ///
  52. /// </summary>
  53. public UserIdentity<TKey> Identity { get; private set; }
  54.  
  55. IIdentity IPrincipal.Identity
  56. {
  57. get { return Identity; }
  58. }
  59.  
  60. bool IPrincipal.IsInRole(string role)
  61. {
  62. throw new NotImplementedException();
  63. }
  64. }
  65.  
  66. public interface IUser<T>
  67. {
  68. /// <summary>
  69. /// 用户id
  70. /// </summary>
  71. T UserID { get; set; }
  72.  
  73. /// <summary>
  74. /// 登录账号
  75. /// </summary>
  76. string LoginNo { get; set; }
  77. /// <summary>
  78. /// 用户名称
  79. /// </summary>
  80. string UserName { get; set; }
  81. /// <summary>
  82. /// 角色编号
  83. /// </summary>
  84. string RoleCode { get; set; }
  85.  
  86. /// <summary>
  87. /// 登录后分配token
  88. /// </summary>
  89. string token { get; set; }
  90. }
  1.  

2、验证签名:

约定签名规则

controller或action增加属性验证

  1. [AuthSign(AuthSignTypeEnum.Common)]

创建AuthSignAttribute继承AuthorizeAttribute

  1. public class AuthSignAttribute : AuthorizeAttribute
  2. {
  3. public AuthSignTypeEnum AuthSignType { get; set; }
  4. public AuthSignAttribute() { this.AuthSignType = AuthSignTypeEnum.Common; }
  5. public AuthSignAttribute(AuthSignTypeEnum authSignType)
  6. {
  7. this.AuthSignType = authSignType;
  8. }
  9. /// <summary>
  10. /// 公共请求主体数据
  11. /// </summary>
  12. private string CommonRequestBodyData { get; set; }
  13.  
  14. /// <summary>
  15. /// 权限验证
  16. /// </summary>
  17. /// <param name="actionContext"></param>
  18. /// <returns></returns>
  19. protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext)
  20. {
  21. var request = actionContext.Request;
  22. var requestBodyData = StreamHelper.GetStream2String(request.Content.ReadAsStreamAsync().Result);
  23. if (AuthSignType == AuthSignTypeEnum.Common)
  24. {
  25. CommonRequestBodyData = requestBodyData.TrimStart("data=".ToCharArray());
  26. var urlParam = GetUrlParam(actionContext);
  27. if (!urlParam.IsSuccess) return false;
  28. var rm = AuthSignCommon(urlParam.Result, CommonRequestBodyData);
  29. if (!rm.IsSuccess)
  30. return false;
  31. }
  32.  
  33. return true;
  34. }
  35.  
  36. private ResultApiModel AuthSignCommon(CommonRequestApiModel request, string requestBodyData)
  37. {
  38. //todo 验证signreturn ResultApiModel.Create(true);
  39. }/// <summary>
  40. /// 处理未授权的请求
  41. /// </summary>
  42. /// <param name="actionContext"></param>
  43. protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
  44. {
  45. StringBuilder sbMsg = new StringBuilder();
  46. if (AuthSignType == AuthSignTypeEnum.Common)
  47. {
  48. //todo 处理验证失败信息
  49. }
  50. var content = JsonConvert.SerializeObject(new ResultApiModel { IsSuccess = false, Message = sbMsg.ToString() + " 签名验证失败,状态:" + HttpStatusCode.Unauthorized });
  51. actionContext.Response = new HttpResponseMessage
  52. {
  53. Content = new StringContent(content, Encoding.UTF8, "application/json"),
  54. StatusCode = HttpStatusCode.Unauthorized
  55. };
  56. }
  57. }
  58. /// <summary>
  59. /// 签名类型
  60. /// </summary>
  61. public enum AuthSignTypeEnum
  62. {
  63. Common =
  64. }

3、访问日志:

controller或action增加属性

[RoutePrefix("api/Out"), OperateTrack, AuthToken(AuthTypeEnum.Driver)]

不需要日志可以[NoLog]

  1. [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true)]
  2. public class NoLogAttribute : Attribute
  3. {
  4. }

继承:ActionFilterAttribute

  1. public class OperateTrackAttribute : ActionFilterAttribute
  2. {
  3. /// <summary>
  4. /// 自定义参数
  5. /// </summary>
  6. public string msg { get; set; }
  7. public OperateTrackAttribute()
  8. {
  9.  
  10. }
  11.  
  12. /// <summary>
  13. /// 初始化时填入类的说明
  14. /// </summary>
  15. /// <param name="message"></param>
  16. public OperateTrackAttribute(string message)
  17. {
  18. msg = message;
  19. }
  20.  
  21. private static readonly string key = "enterTime";
  22. public override Task OnActionExecutingAsync(System.Web.Http.Controllers.HttpActionContext actionContext, CancellationToken cancellationToken)
  23. {
  24. if (SkipLogging(actionContext))
  25. {
  26. return base.OnActionExecutingAsync(actionContext, cancellationToken);
  27.  
  28. }
  29. //记录进入请求的时间
  30. actionContext.Request.Properties[key] = DateTime.Now.ToBinary();
  31.  
  32. return base.OnActionExecutingAsync(actionContext, cancellationToken);
  33. }
  34. /// <summary>
  35. /// 在请求执行完后 记录请求的数据以及返回数据
  36. /// </summary>
  37. /// <param name="actionExecutedContext"></param>
  38. /// <param name="cancellationToken"></param>
  39. /// <returns></returns>
  40. public override Task OnActionExecutedAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
  41. {
  42. object beginTime = null;
  43. if (actionExecutedContext.Request.Properties.TryGetValue(key, out beginTime))
  44. {
  45. DateTime time = DateTime.FromBinary(Convert.ToInt64(beginTime));
  46. HttpRequest request = HttpContext.Current.Request;
  47. string token = request.Headers["token"];
  48.  
  49. WebApiActionLogModel apiActionLog = new WebApiActionLogModel
  50. {
  51. Id = Guid.NewGuid(),
  52. //获取action名称
  53. actionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName,
  54. //获取Controller 名称
  55. controllerName = actionExecutedContext.ActionContext.ActionDescriptor.ControllerDescriptor.ControllerName,
  56. //获取action开始执行的时间
  57. enterTime = time,
  58. //获取执行action的耗时
  59. costTime = (DateTime.Now - time).TotalMilliseconds,
  60. navigator = request.UserAgent,
  61. token = token,
  62. //获取用户token
  63. userId = getUserByToken(token),
  64. //获取访问的ip
  65. ip = request.UserHostAddress,
  66. userHostName = request.UserHostName,
  67. urlReferrer = request.UrlReferrer != null ? request.UrlReferrer.AbsoluteUri : "",
  68. browser = request.Browser.Browser + " - " + request.Browser.Version + " - " + request.Browser.Type,
  69. //获取request提交的参数
  70. paramaters = StreamHelper.GetStream2String(actionExecutedContext.Request.Content.ReadAsStreamAsync().Result),
  71. //获取response响应的结果
  72. executeResult = StreamHelper.GetStream2String(actionExecutedContext.Response.Content.ReadAsStreamAsync().Result),
  73. comments = msg,
  74. RequestUri = request.Url.AbsoluteUri
  75. };
  76. //记debug
  77. Log.DefaultLogDebug(string.Format("actionExecutedContext {0} 请求:{1}", apiActionLog.controllerName + "/" + apiActionLog.actionName, JsonHelper.ToJson(apiActionLog)));
  78. }
  79. return base.OnActionExecutedAsync(actionExecutedContext, cancellationToken);
  80.  
  81. }
  82. /// <summary>
  83. /// 获取当前登录用户的id
  84. /// </summary>
  85. /// <param name="token"></param>
  86. /// <returns></returns>
  87. public static string getUserByToken(string token)
  88. {
  89. UserIdentity<int> u = HttpContext.Current.User.Identity as UserIdentity<int>;
  90. if (u == null) return "未登录用户" + token;
  91. return u.LoginNo.ToString();
  92. }
  93.  
  94. /// <summary>
  95. /// 判断类和方法头上的特性是否要进行Action拦截
  96. /// </summary>
  97. /// <param name="actionContext"></param>
  98. /// <returns></returns>
  99. private static bool SkipLogging(System.Web.Http.Controllers.HttpActionContext actionContext)
  100. {
  101. return actionContext.ActionDescriptor.GetCustomAttributes<NoLogAttribute>().Any() || actionContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes<NoLogAttribute>().Any();
  102. }
  103. }
  104.  

c# webapi 过滤器token、sign认证、访问日志的更多相关文章

  1. ASP.NET WebApi 基于OAuth2.0实现Token签名认证

    一.课程介绍 明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将是我们需要思考的问题.为了保护我们的WebApi数 ...

  2. ASP.NET WebApi 基于JWT实现Token签名认证

    一.前言 明人不说暗话,跟着阿笨一起玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NET WebServi ...

  3. ASP.NET WebApi 基于分布式Session方式实现Token签名认证

    一.课程介绍 明人不说暗话,跟着阿笨一起学玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NETWebSer ...

  4. ASP.NET WebApi 基于分布式Session方式实现Token签名认证(发布版)

    一.课程介绍 明人不说暗话,跟着阿笨一起学玩WebApi!开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NETWebSer ...

  5. apache用户认证、域名跳转、Apache访问日志(两种格式)

    1.apache 设置,用户访问时 目录或文件的认证: 对目录的认证: <Directory /var/www/222> //指定认证的目录AllowOverride AuthConfig ...

  6. centos LAMP第二部分apache配置 下载discuz!配置第一个虚拟主机 安装Discuz! 用户认证 配置域名跳转 配置apache的访问日志 配置静态文件缓存 配置防盗链 访问控制 apache rewrite 配置开机启动apache tcpdump 第二十节课

    centos    LAMP第二部分apache配置  下载discuz!配置第一个虚拟主机 安装Discuz! 用户认证 配置域名跳转  配置apache的访问日志  配置静态文件缓存  配置防盗链 ...

  7. Apache用户认证、域名跳转、Apache访问日志

    5月29日任务 课程内容: 11.18 Apache用户认证11.19/11.20 域名跳转11.21 Apache访问日志扩展 apache虚拟主机开启php的短标签 http://ask.apel ...

  8. Linux CentOS7 VMware LAMP架构Apache用户认证、域名跳转、Apache访问日志

    一.Apache用户认证 vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf //把111.com那个虚拟主机编辑成如下内容 <Virtu ...

  9. C# WebApi 过滤器的使用开发接口必备利器

    在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截处理.引入了这一机制可以更好地践行DRY(Don’t Repeat Yourself)思想 ...

随机推荐

  1. 洛谷P4047 [JSOI2010]部落划分题解

    洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...

  2. Pandas使用实用技巧

    Pandas实用使用技巧 1 列拆分成行 常见的需求是将某一列根据指定的分隔符拆分成多列.现有需求,根据指定的分隔符将其拆分为多行. 例: df = A B 0 a f 1 b;c h;g 2 d k ...

  3. 辨析Java方法参数中的值传递和引用传递

    小方法大门道 小瓜瓜作为一个Java初学者,今天跟我说她想通过一个Java方法,将外部变量通过参数传递到方法中去,进行逻辑处理,方法执行完毕之后,再对修改过的变量进行判断处理,代码如下所示. publ ...

  4. photoshop 的安装破解

    最近学习需要用到photoshop,但是photoshop试用期只有30天,于是尝试破解photoshop.参考了网上的很多博客,失败了好几次,终于找到一篇靠谱的博客,很顺利的成功了.在这里记录一下, ...

  5. 剑指offer:左旋转字符串

    题目描述: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”ab ...

  6. Dolly

    dolly - 必应词典 美['dɑli]英['dɒli] n.洋娃娃:(搬运重物的)台车 v.用独轮车运(物):用搅拌棒洗(衣):用捣棒捣碎(矿石) 网络多莉:多利:移动式摄影小车 变形复数:dol ...

  7. Fabric.js canvas 图形库

    1.github地址: https://github.com/fabricjs/fabric.js 2.简述 Fabric.js将canvas的编程变得简单.同时在canvas上添加了交互.交互包括: ...

  8. windows server2012 R2安装python3.x版本报错0x80240017

    windows server2012 R2安装python3.x版本报错0x80240017 环境: windows server 2012 R2系统 问题: 安装python3.5版本时候出现错误0 ...

  9. Android 加密之文件级加密(CE/DE)

    https://blog.csdn.net/myfriend0/article/details/77094890/   Android加密之文件级加密

  10. ROS tf监听编写

    博客转载自:https://www.ncnynl.com/archives/201702/1311.html ROS与C++入门教程-tf-编写tf listener(监听) 说明: 介绍如何使用tf ...