ASP.Core之Jwt Token登錄許可權驗證
題前話:
隨著移動設備的浪潮,以及前端各種JS mvvm框架的發展,前後端分離地更加徹底。最徹底的是網站Html頁面 完全不需要後端來渲染了,前後臺交互全部依靠json來傳遞數據。那麼問題來了,怎麼判斷用戶是否登錄或者用戶是否有許可權訪問當前所請求的資源?這就是今天的主題,好了,Lets Start...(本文默認讀者熟悉asp.core,以及asp許可權控制的相關知識)
asp.core能夠讓我們自定義Middleware(中間件),首先我們先來看一張官方的圖吧
直接貼處理核心代碼吧:
public Task Invoke(HttpContext httpContext)
{
//檢測是否包含Authorization請求頭,如果不包含返回context進行下一個中間件,用於訪問不需要認證的API
if (!httpContext.Request.Headers.ContainsKey("Authorization"))
return _next(httpContext);
else
{
var tokenHeader = httpContext.Request.Headers["Authorization"];
try
{
tokenHeader = tokenHeader.ToString().Substring("Bearer ".Length).Trim();
var result = Config.StoreSignedUser.list.Where(m => m.userToken == tokenHeader).FirstOrDefault();
if (result == null)
return httpContext.Response.WriteAsync("非法請求");
else
{
ClaimsIdentity identity = new ClaimsIdentity(result.userClaims);
ClaimsPrincipal principal = new ClaimsPrincipal(identity);
httpContext.User = principal;//構建authorize認證
return _next(httpContext);
}
}
catch(Exception e)
{
return httpContext.Response.WriteAsync("token值長度不夠");
}
}
直接貼一張流程圖吧,更好理解
然後許可權驗證處理需要添加這個包:Microsoft.AspNetCore.Authentication.JwtBearer
這個用於生成token。我們在stratup.cs裏配置許可權驗證吧
第二個表示用的是test這個策略,starup.cs裏配置的是admin這個策略需要test這個test。
最後我們來看一下怎麼生成token的吧。
做如下請求,用戶名和密碼見源碼
把token拷貝下來,再次請求
後記:
關於用redis來儲存已登錄用戶的用戶名,token值,以及claims的思考,無疑這是最好的解決方案。把已登錄的用戶數據存在數據,而每次請求都請求一次資料庫,伺服器壓力肯定大。用redis就可以解決這個問題,token過期也自然解決了。
最後貼上github地址,歡迎大家提issue,如果覺得本文有幫助,可以star,可以讚賞,謝謝~
推薦閱讀: