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

    未完待续...

    @天才卧龙的博客

  • 相关阅读:
    maven创建的quickstart项目生成可执行jar
    spring boot 修改banner
    spring boot项目打包成war
    node集成mysql——pool连接池
    adb命令模拟按键输入keycode
    Spring 全局异常处理
    程序开发中版本管理之命名规则及格式
    群晖Nas中搭建Intellij Idea的LicenseServer服务
    uml-类图书写指南
    Spring Boot + Docker + K8S 简单示例
  • 原文地址:https://www.cnblogs.com/chenwolong/p/NetCoreToken.html
Copyright © 2020-2023  润新知