1.新建一个.net core2.1 基于 api 的工程,引用Microsoft.AspNetCore.Authentication.JwtBearer 包

2.新建一个Token的实体类,一个Jwt的基础类

 public class TokenModel
{
/// <summary>
/// 用户Id
/// </summary>
public long userId { get; set; }
/// <summary>
/// 用户名
/// </summary>
public string userCode { get; set; }
/// <summary>
/// 手机
/// </summary>
public string phone { get; set; }
/// <summary>
/// 头像
/// </summary>
public string icon { get; set; }
/// <summary>
/// 昵称
/// </summary>
public string userName { get; set; }
/// <summary>
/// 身份
/// </summary>
public string sub { get; set; }
/// <summary>
/// 角色
/// </summary>
public string role { get; set; }
}

TokenModel

 /// <summary>
/// 基础配置
/// </summary>
public class JwtSettings
{
//token是谁颁发的
public string Issuer { get; set; }
//token可以给哪些客户端使用
public string Audience { get; set; }
//加密的key
public string SecretKey { get; set; }
//过期时间 单位:s
public string ExpireTime { get; set; }
}

JwtSettings

3.在Appsetting.json中添加默认值

  "JwtSettings": {
"Issuer": "NinaMua",
"Audience": "http://localhost:5000",
"SecretKey": "NinaMua'sSecretKeyMuaMuaMua",//16位字符以上
"ExpireTime": "" //过期时间||单位:s
}

4.新建一个类去把在appsetting设定的值变成一个可以全局引用的对象

public class AppSettingsInit
{
public static JwtSettings JwtSettings; /// <summary>
/// 将配置项的值赋值给属性
/// </summary>
/// <param name="configuration"></param>
public void Initial(IConfiguration configuration)
{
JwtSettings = new JwtSettings();
JwtSettings.Audience = configuration["JwtSettings:Audience"];
JwtSettings.Issuer = configuration["JwtSettings:Issuer"];
JwtSettings.SecretKey = configuration["JwtSettings:SecretKey"];
JwtSettings.ExpireTime = configuration["JwtSettings:ExpireTime"]; }
}

5.去新增一个JwtTokenHelper类

  public class JwtTokenHelper
{
public static JwtSecurityTokenHandler _jwt = new JwtSecurityTokenHandler(); /// <summary>
/// 颁发JWT字符串
/// </summary>
/// <param name="tokenModel"></param>
/// <returns></returns>
public static string IssueJwt(TokenModel tokenModel)
{
var encodedJwt = "";
try
{
var claims = new Claim[]
{
new Claim("userId", tokenModel.userId.ToString()),
new Claim("userCode", tokenModel.userCode),
new Claim("phone", tokenModel.phone),
new Claim("userName", tokenModel.userName),
new Claim("role", tokenModel.role),
new Claim("tokenType", tokenModel.tokenType.ToString())
}; DateTime expTime = DateTime.Now.AddSeconds(Convert.ToDouble(AppSettingsInit.JwtSettings.ExpireTime));
//秘钥
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(AppSettingsInit.JwtSettings.SecretKey));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var jwt = new JwtSecurityToken(
issuer: AppSettingsInit.JwtSettings.Issuer,
audience: AppSettingsInit.JwtSettings.Audience,
claims: claims,
expires: expTime,//过期时间
signingCredentials: creds); encodedJwt = _jwt.WriteToken(jwt);
}
catch (Exception ex)
{ }
if (encodedJwt != "")
encodedJwt = $"{JwtBearerDefaults.AuthenticationScheme} {encodedJwt}";
return encodedJwt;
} /// <summary>
/// 解析jwt字符串
/// </summary>
/// <param name="jwtStr"></param>
/// <returns></returns>
public static TokenModel SerializeJWT(string jwtStr)
{
var tm = new TokenModel();
JwtSecurityToken jwtToken = _jwt.ReadJwtToken(jwtStr); try
{
var JwtList = jwtToken.Payload;
tm.userCode = JwtList["userCode"]?.ToString();
tm.userId = Convert.ToInt64(JwtList["userId"]);
tm.userCode = JwtList["userCode"]?.ToString();
tm.phone = JwtList["phone"]?.ToString();
tm.userName = JwtList["userName"]?.ToString();
tm.role = JwtList["role"]?.ToString();
}
catch (Exception e)
{
// ignored
}
return tm;
} }

JwtTokenHelper

6.在startup.cs中的ConfigureServices注入依赖

  public void ConfigureServices(IServiceCollection services)
{ #region 配置登录授权
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }).AddJwtBearer(JwtBearerDefaults.AuthenticationScheme,
(jwtBearerOptions) =>
{
jwtBearerOptions.TokenValidationParameters = new TokenValidationParameters
{
//需要跟生成Token的信息保持一致
ValidateIssuerSigningKey = true,//验证全局秘匙||默认True
IssuerSigningKey = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(AppSettingsInit.JwtSettings.SecretKey)),
ValidateIssuer = true,//验证发布者||默认True
ValidIssuer = AppSettingsInit.JwtSettings.Issuer,
ValidateAudience = true,//验证访问者||默认True
ValidAudience = AppSettingsInit.JwtSettings.Audience,
ValidateLifetime = true,//验证生命周期||默认True
ClockSkew = TimeSpan.Zero };
}); #endregion services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); #region 配置Swagger
services.AddSwaggerGen(c =>
{
#region 顶部基础信息 c.SwaggerDoc("v1", new Info
{
Version = "v1.1.0",
Title = "WebAPI",
Description = "API帮助文档",
TermsOfService = "None",
Contact = new Swashbuckle.AspNetCore.Swagger.Contact { Name = "NinaMua", Email = "791016081@qq.com", Url = "http://www.cnblogs.com/NinaMua" }
});
#endregion #region 权限验证信息 //添加一个必须的全局安全信息,和AddSecurityDefinition方法指定的方案名称要一致
var security = new Dictionary<string, IEnumerable<string>> { { "Bearer", new string[] { } } };
c.AddSecurityRequirement(security); c.AddSecurityDefinition("Bearer", new ApiKeyScheme
{
Description = "格式|Bearer {token}",
Name = "Authorization",//jwt默认的参数名称
In = "header",//jwt默认在请求头中存放Authorization信息
Type = "apiKey"
}); #endregion #region 添加读取注释服务
//添加对控制器的标签(描述)通过对SwaggerDocTag添加备注
//c.DocumentFilter<SwaggerDocTag>();
var basePath = AppDomain.CurrentDomain.BaseDirectory; var apiXmlPath = Path.Combine(basePath, "TestApi.xml");
if (System.IO.File.Exists(apiXmlPath))
c.IncludeXmlComments(apiXmlPath, true);//控制器层注释(true表示显示控制器注释) var entityXmlPath = Path.Combine(basePath, "TestEntity.xml");
if (System.IO.File.Exists(entityXmlPath))
c.IncludeXmlComments(entityXmlPath);//实体类注释
#endregion });
#endregion }

ConfigureServices

7.在startup.cs中的Configure注入中间件

  // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
} app.UseHttpsRedirection();
app.UseAuthentication();//配置授权 loggerFactory.AddNLog();//添加NLog
env.ConfigureNLog("nlog.config");//读取Nlog配置文件 #region Swagger
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "ApiHelp V1");
});
#endregion app.UseMvc();
}

Configure

8.在api接口上加上权限认证[Authorize]

    [Route("api/")]
public class LoginController : BaseApiController
{ public ILogger<LoginController> logger;
/// <param name="_logger">日志</param>
public LoginController(ILogger<LoginController> _logger)
{
logger = _logger;
} /// <summary>
/// 登录
/// </summary>
/// <returns></returns>
[Route("Login")]
[HttpGet]
public ResponseMessage Login()
{
///用户是否存在///
TokenModel temp = new TokenModel();
temp.userName = "系统管理员";
temp.userCode = "system";
temp.role = "Admin";
temp.phone = "";
temp.icon = "";
var result = JwtTokenHelper.IssueJwt(temp);
if (result != "")
return Success(result);
else
return CustomizeResponse(, "登录失败");
} /// <summary>
/// 退出
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("SignOut")]
[Authorize]
public string Exit()
{
return "";
} }

9.测试

在没有token的请求中~请求接口401

拿到token后放在全局之中

.net core 2.1 基于Jwt的登录认证的更多相关文章

  1. AntDesign Pro + .NET Core 实现基于JWT的登录认证

    很多同学说AgileConfig的UI实在是太丑了.我想想也是的,本来这个项目是我自己使用的,一开始甚至连UI都没有,全靠手动在数据库里修改数据.后来加上了UI也是使用了老掉牙的bootstrap3做 ...

  2. token 与 基于JWT的Token认证

    支持跨域访问,无状态认证 token特点 支持跨域访问: Cookie是不允许垮域访问的,这一点对Token机制是不存在的,前提是传输的用户认证信息通过HTTP头传输 无状态(也称:服务端可扩展行): ...

  3. 基于JWT的Token认证机制及安全问题

    [干货分享]基于JWT的Token认证机制及安全问题 https://bbs.huaweicloud.com/blogs/06607ea7b53211e7b8317ca23e93a891

  4. 厉害!我带的实习生仅用四步就整合好SpringSecurity+JWT实现登录认证!

    小二是新来的实习生,作为技术 leader,我还是很负责任的,有什么锅都想甩给他,啊,不,一不小心怎么把心里话全说出来了呢?重来! 小二是新来的实习生,作为技术 leader,我还是很负责任的,有什么 ...

  5. 简单说说基于JWT的token认证方式

    一.什么是认证 好多人不知道什么是认证,认证,其实就是服务端确认用户身份.Http协议是无状态的,客户端发送一条请求,服务端返回一条响应,二者就算做成一单买卖,一拍两散.在很久以前,互联网所能提供的服 ...

  6. 【项目实践】一文带你搞定Session和JWT的登录认证方式

    以项目驱动学习,以实践检验真知 前言 登录认证,估计是所有系统中最常见的功能了,并且也是最基础.最重要的功能.为了做好这一块而诞生了许多安全框架,比如最常见的Shiro.Spring Security ...

  7. JWT实现登录认证实例

    JWT全称JSON Web Token,是一个紧凑的,自包含的,安全的信息交换协议.JWT有很多方面的应用,例如权限认证,信息交换等.本文将简单介绍JWT登录权限认证的一个实例操作. JWT组成 JW ...

  8. ASP.NET Core 实战:基于 Jwt Token 的权限控制全揭露

    一.前言 在涉及到后端项目的开发中,如何实现对于用户权限的管控是需要我们首先考虑的,在实际开发过程中,我们可能会运用一些已经成熟的解决方案帮助我们实现这一功能,而在 Grapefruit.VuCore ...

  9. SSM基于Token的登录认证

    1.什么是token token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识. 当用户第一次登录后,服务器生成一个token并将此token返回给客户端,以后客户端只需带上 ...

随机推荐

  1. return之为什么能够终止函数,代码演练

    ''' return 有终止函数的作用,下面通过执行到return x 以后, 就结束了程序的下一步执行,所以就没有往下面走,所以终端上也就只能 看到打印结果100,看不到打印呢 ''' def se ...

  2. C# VS2010 windows服务的安装

    可能是太过于懒惰的原因,研究个windows 服务的安装程序都花了大半天时间.在网上看了一些示例,大部分都言过其实,把过程搞得太过复杂,老是需要去研究如何利用InstallUtil.exe及其参数.事 ...

  3. Leetcode 42 接雨水 双指针

    地址 https://leetcode-cn.com/problems/trapping-rain-water/ 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能 ...

  4. 深度强化学习(DQN-Deep Q Network)之应用-Flappy Bird

    深度强化学习(DQN-Deep Q Network)之应用-Flappy Bird 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-fu ...

  5. Linux Bash之通配符

    通配符是我们在shell环境中不知不觉中都会用到的,有时甚至都不会考虑到去探究其实现过程,因为使用得太普遍了.而清晰地理解每一个过程,将有助于我们的分析和调试. 说白了,通配符就是在 shell 环境 ...

  6. POJ2182题解——线段树

    POJ2182题解——线段树 2019-12-20 by juruoOIer 1.线段树简介(来源:百度百科) 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线 ...

  7. 2019年12道RabbitMQ高频面试题你都会了吗?(含答案解析)

    RabbitMQ 面试题 1.什么是 rabbitmq 2.为什么要使用 rabbitmq 3.使用 rabbitmq 的场景 4.如何确保消息正确地发送至 RabbitMQ? 如何确保消息接收方消费 ...

  8. C++ lambda expression

    Emerged since c++11, lambda expression/function is an unnamed function object capable of capturing v ...

  9. 微信小程序APP生命周期

    小程序APP生命周期需要先从app.js这个文件开始,App() 必须在 app.js 中调用,必须调用且只能调用一次,app.js中定义了一些应用的生命周期函数 onLaunch----当小程序初始 ...

  10. DDMS files not found: xxx\hprof-conv.exe

    出现如下错误: DDMS files not found: xxx\hprof-conv.exe The connection to adb is down, and a severe error h ...