NetCore WebApi 基於Jwt的驗證授權方式


十年河東,十年河西,莫欺少年窮

學無止境,精益求精

之前寫過 MVC webApi 的Jwt Token驗證方式,博客地址為:JSON WEB TOKEN,簡單談談TOKEN的使用及在C#中的實現

netCore JWT認證比較好的一篇博客如下:https://www.cnblogs.com/liuww/p/12177272.html

由於Net升級過快,不得不溫故而知新,因此才有這篇博客的誕生

首先關於JWT Token是什么,它是如何進行工作的,又是如何結合WebApi的,這些問題都可以盡情參考鄙人之前的博客。也就是上述的鏈接地址。

今天由於時間原因,暫時不寫具體的實現,僅僅提供netCore Token的生成方法。

如下:

    public class Contanst
    {
        /// <summary>
        /// This is a private key for Server
        /// //這個是生成Token時,服務端加密秘鑰 屬於私鑰
        /// </summary>
        public const string JwtSecurityKey = "Movit-Tech";
    }

當然,這個密鑰也可以寫在配置文件中。

用戶基本信息類

    public class UserInfoModel
    {
        public string userId { get; set; } = Guid.NewGuid().ToString();
        public string userSex { get; set; } = "";
        public string userPhone { get; set; } = "18137070152";
        public string userAccount { get; set; } = "chenwolong";
        public string userName { get; set; } = "陳卧龍";
        public string userCompany { get; set; } = "盟拓軟件(蘇州)有限公司";
        public string userRole { get; set; } = "SuperAdmin";
       /*
        等等其他屬性
         */
    }

這里簡單介紹下Token的使用,個人理解,主要分為以下幾個步驟

1、用戶請求登錄驗證WebApi接口,該接口用於驗證用戶的登錄賬戶及密碼,如果通過驗證,返回給用戶一個Token

2、用戶拿到Token后,將Token放在Http請求頭中,請求其他有權限限制的接口。在這里,我們可以把Token理解為令牌,未持有令牌的請求,是不被允許的。

3、用戶獲得的Token令牌有一定的時效,過期后,需要重新驗證登錄接口,待登錄驗證通過后,服務器會返回用戶新的令牌。用戶攜帶新的令牌進行接口請求。

OK,大致過程就是這樣,權限控制更完善的做法是:Token中存放的信息結合數據庫,Redis等存儲的數據,返回用戶可訪問接口列表或其他數據、功能權限。

NetCore生成Token的方法如下:

using Microsoft.IdentityModel.Tokens;
using NetCoreCommon;
using NetCoreModels;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;

namespace NetCoreTokenApi
{
    public class TokenHelper
    {
        public string GetToken(UserInfoModel user)
        {

            var key = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(Contanst.JwtSecurityKey));
            var claims = new Claim[]
            {
            new Claim(ClaimTypes.Name,user.userAccount),
            new Claim(ClaimTypes.NameIdentifier,user.userId),
            new Claim(ClaimTypes.Role,user.userRole),
            new Claim(ClaimTypes.Actor,user.userName),
            };
            var expires = DateTime.Now.AddHours(12);//生命周期 12小時
            var token = new JwtSecurityToken(
                        issuer: user.userName,//非必須。issuer 請求實體,可以是發起請求的用戶的信息,
                        audience: "http://example.com",//非必須。接收該JWT的一方。
                        claims: claims,
                        notBefore: DateTime.Now,
                        expires: expires,
                        signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256));

            //生成Token
            string jwtToken = new JwtSecurityTokenHandler().WriteToken(token);
            return jwtToken;
        }
    }
}
View Code

時間原因,今天僅實現Token的生成,不結合接口進行相關測試。將來有時間了,會繼續完善。

未完待續...

@天才卧龍的博客


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM