NetCore WebApi 基于Jwt的验证授权方式

十年河东,十年河西,莫欺少年穷

学无止境,精益求精

之前写过 MVC webApi 的Jwt Token验证方式,博客地址为:JSON WEB TOKEN,简单谈谈TOKEN的使用及在C#中的实现

由于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的生成,不结合接口进行相关测试。将来有时间了,会继续完善。

未完待续...

@天才卧龙的博客

原文地址:https://www.cnblogs.com/chenwolong/p/NetCoreToken.html