操作过滤器—MVC中使用操作过滤器实现JWT权限认证
|
前言
上一篇文章分享了授权过滤器实现JWT进行鉴权,文章链接:授权过滤器—MVC中使用授权过滤器实现JWT权限认证,接下来将用操作过滤器实现昨天的JWT鉴权。
一、什么是操作过滤器?
与授权过滤器大部分一样,只是执行的时机和继承的接口有所不同。操作过滤器是在Action执行的前和后进行调用执行。而不是像授权过滤器一样,在刚开上来就执行授权过滤器。操作过滤器的实现了是 IAsyncActionFilter 或 IActionFilter 接口。
二、操作过滤器实现
操作过滤器重新定义Filter:
继承类Attribute, 接口MyAuthorizeFilterAttribute ,然后实现接口OnActionExecuted方法和OnActionExecuting方法,提供更多的对Action执行处理方法。此处在Action执行时书写自定义业务逻辑。- /// <summary>
- /// 授权过滤器
- /// </summary>
- public class MyAuthorizeFilterAttribute : Attribute, IActionFilter
- {
- #region IActionFilter 操作过滤器实现
- /// <summary>
- /// Action执行后
- /// </summary>
- /// <param name="context"></param>
- public void OnActionExecuted(ActionExecutedContext context)
- {
- }
- /// <summary>
- /// Action执行前
- /// </summary>
- /// <param name="context"></param>
- public void OnActionExecuting(ActionExecutingContext context)
- {
- var authHeader = context.HttpContext.Request.Headers["Authorization"];
- if (string.IsNullOrWhiteSpace(authHeader))
- {
- //var json = JsonConvert.SerializeObject(new OperationResult(OperationResultType.Error, "保存失败"));
- //此接口必须携带token访问!
- context.Result = new ContentResult()
- {
- Content = "此接口必须携带token访问,请登录携带Token访问",
- ContentType = "text/html"//application/json
- };
- }
- else //字段值不为空
- {
- authHeader = authHeader.ToString().Replace("Bearer", "").Trim();//去掉Bearer字串
- if (authHeader == "")
- {
- context.Result = new ContentResult()
- {
- Content = "token验证失败:您没有权限调用此接口,请登录重新获取Token",
- ContentType = "text/html"
- };
- }
- else
- {
- LoginUserInfo LoginInfo = JwtHelper.GetJwtDecode(authHeader);
- string UserName = LoginInfo.username;
- string PassWord = LoginInfo.pwd;
- double ExpireTimeStamp = LoginInfo.exp;
- if (isTokenExpire(ExpireTimeStamp)) //这里应该验证有效期
- {
- //token验证失败:您没有权限调用此接口,请登录获取Token
- context.Result = new ContentResult()
- {
- Content = "token验证失败:您没有权限调用此接口,请登录重新获取Token",
- ContentType = "text/html"
- };
- }
- }
- }
- }
- #endregion
- /// <summary>
- /// 时间戳字符串
- /// </summary>
- /// <param name="timestamp"></param>
- /// <returns></returns>
- private bool isTokenExpire(double timestamp)
- {
- try
- {
- System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));//当地时区
- var expireTime = startTime.AddSeconds(timestamp);
- if (expireTime > DateTime.Now)
- {
- return false;//未过期
- }
- else
- {
- return true;//已过期
- }
- }
- catch (Exception ex)
- {
- return true;
- }
- }
- }
复制代码 其他实现代码和上篇保持一致:
三、验证:
操作过滤器实现的接口部分代码没有改动,只改动过滤器的书写,所以和上篇测试验证方法一致。
未授权访问:
不携带Token访问:
授权访问:
获取Token:
携带Token访问:
建群声明:本着技术在于分享,方便大家交流学习的初心,特此建立【编程内功修炼交流群】,热烈欢迎各位爱交流学习的程序员进群,也希望进群的大佬能不吝分享自己遇到的技术问题和学习心得!
来源:https://www.cnblogs.com/wml-it/archive/2023/08/11/17622162.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|
|
|
发表于 2023-8-11 11:23:54
举报
回复
分享
|
|
|
|