## 前言 上一篇文章分享了授權過濾器實現JWT進行鑒權,文章鏈接:[授權過濾器—MVC中使用授權過濾器實現JWT許可權認證](https://www.cnblogs.com/wml-it/p/17612434.html),接下來將用操作過濾器實現昨天的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/p/17622162.html
技術的發展日新月異,隨著時間推移,無法保證本博客所有內容的正確性。如有誤導,請大家見諒,歡迎評論區指正!
開源庫鏈接,歡迎點亮:
GitHub:https://github.com/ITMingliang
Gitee:https://gitee.com/mingliang_it
GitLab:https://gitlab.com/ITMingliang
【編程內功修煉交流群】: 【個人公眾號】:
![](https://images.cnblogs.com/cnblogs_com/wml-it/2196906/t_220731064016_wx.jpg)
![](https://images.cnblogs.com/cnblogs_com/wml-it/2196906/o_230807062355_gongzhonghao.jpg)