热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

.NETCOREwebapi集成jwt登录认证

一、什么是JSONWeb令牌?JSONWebToken(JWT)是一种开放标准(RFC7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。

一、什么是JSON Web令牌?

  JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。此信息可以验证和信任,因为它是经过数字签名的。JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名

  虽然JWT可以被加密以在各方之间提供保密性,但我们将重点关注签名令牌。签名令牌可以验证其中包含的声明的完整性,而加密令牌会对其他方隐藏这些声明。当使用公钥/私钥对令牌进行签名时,签名还证明只有持有私钥的一方才是签名方。


二、When should you use JSON Web Tokens?

  以下是一些JSON Web标记有用的场景:

  授权:这是使用JWT最常见的场景。用户登录后,每个后续请求都将包括JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是目前广泛使用JWT的一种功能,因为它的开销很小,并且能够轻松地跨不同的域使用。

  信息交换:JSON Web令牌是在各方之间安全传输信息的好方法。因为JWT可以签名,例如,使用公钥/私钥对,您可以确保发送者是他们所说的人。此外,由于签名是使用报头和有效载荷计算的,因此您还可以验证内容没有被篡改。

  什么是JSON Web令牌结构?

  在紧凑的形式中,JSON Web标记由三部分组成,由点(.)分隔,它们是:标题  有效载荷  签名

  因此,JWT通常如下所示。

  xxxxx。YYYY。zzzzz

  让我们把不同的部分分解一下。 

  标题

  标头通常由两部分组成:令牌的类型(JWT)和正在使用的签名算法(如HMAC SHA256或RSA)。

  For example:

  {
  "alg": "HS256",
  "typ": "JWT"
  }
  Then, this JSON is Base64Url encoded to form the first part of the JWT.

  有效载荷

  令牌的第二部分是有效载荷,其中包含声明。声明是关于实体(通常是用户)和其他数据的声明。索赔有三种类型:登记索赔、公开索赔和私人索赔。

   注册声明:这些声明是一组预定义的声明,不是强制性的,而是推荐的,以提供一组有用的、可互操作的声明。其中一些是:iss(发行人)、exp(到期时间)、sub(主题)、aud(观众)和其他。

  公开声明:这些声明可以由使用JWTs的人随意定义。但为了避免冲突,它们应该在IANA JSON Web令牌注册表中定义,或者定义为包含防冲突命名空间的URI。

      私人索赔:这些自定义索赔是为了在同意使用它们的各方之间共享信息而创建的,既不是注册索赔,也不是公开索赔。

  

  An example payload could be:

  {
   "sub": "1234567890",
   "name": "John Doe",
   "admin": true
  }

  The payload is then Base64Url encoded to form the second part of the JSON Web Token.


  Signature

  To create the signature part you have to take the encoded header, the encoded payload, a secret, the algorithm specified in the header, and sign that.

  For example if you want to use the HMAC SHA256 algorithm, the signature will be created in the following way:

  签名

  要创建签名部分,您必须获取编码的报头、编码的有效负载、一个秘密、报头中指定的算法,并对其进行签名。 

  例如,如果要使用HMAC SHA256算法,则将按以下方式创建签名:

  HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

  签名用于验证消息在发送过程中没有发生更改,如果是使用私钥签名的令牌,它还可以验证JWT的发送者是它所说的人。

  综合起来

  输出是三个由点分隔的Base64 URL字符串,可以在HTML和HTTP环境中轻松传递,同时与基于XML的标准(如SAML)相比更加紧凑。 

  下面显示了一个JWT,它对前一个头和有效负载进行了编码,并用一个秘密进行了签名。

 

 

 

  如果您想使用JWT并将这些概念付诸实践,可以使用JWT.io,用于解码、验证和生成JWT


三、JSON Web令牌是如何工作的?

  在身份验证中,当用户使用其凭据成功登录时,将返回一个JSON Web令牌。由于令牌是凭证,因此必须非常小心地防止安全问题。一般来说,您不应该将代币保存的时间超过所需时间。由于缺乏安全性,您也不应该在浏览器存储中存储敏感会话数据。 每当用户想要访问受保护的路由或资源时,用户代理都应该发送JWT,通常在使用承载模式的授权报头中。标题的内容应如下所示:

  

Authorization: Bearer

  在某些情况下,这可能是一种无状态授权机制。服务器的受保护路由将在授权头中检查有效的JWT,如果存在,则允许用户访问受保护的资源。如果JWT包含必要的数据,可能会减少查询数据库中某些操作的需要,尽管情况并非总是如此。请注意,如果通过HTTP头发送JWT令牌,则应尽量防止它们变得太大。有些服务器不接受超过8KB的头文件。如果您试图在JWT令牌中嵌入太多信息,比如通过包含所有用户的权限,那么您可能需要另一种解决方案,比如Auth0细粒度授权。如果令牌在授权头中发送,则跨源资源共享(CORS)不会成为问题,因为它不使用COOKIE。

  下图显示了如何获取JWT并使用其访问API或资源:

   

 

     请注意,对于签名令牌,令牌中包含的所有信息都会暴露给用户或其他方,即使他们无法更改。这意味着您不应该将机密信息放入令牌中。

 

四、.NET CORE  添加jwt认证

1、新建jwt参数类

public class TokenConfig
{
///


/// 密钥
///

public static string secret = "9999999999999999999999999";
///
/// 签发者
///

public static string issuer = "yinmingneng";
///
/// 受众
///

public static string audience = "ymn";
///
/// 令牌过期时间
///

public static int accessExpiration = 20;
}

二、身份认证设置成jwt认证,

uilder.Services.AddAuthentication(optiOns=> {
options.DefaultAuthenticateScheme
= JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme
= JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(x
=> {
x.RequireHttpsMetadata
= false;
x.SaveToken
= true;
x.TokenValidationParameters
= new Microsoft.IdentityModel.Tokens.TokenValidationParameters {
ValidateIssuerSigningKey
= true,
IssuerSigningKey
= new SymmetricSecurityKey(Encoding.ASCII.GetBytes(TokenConfig.secret)),
ValidIssuer
= TokenConfig.issuer,
ValidAudience
= TokenConfig.audience,
ValidateIssuer
= false,
ValidateAudience
= false
};
x.Events
= new JwtBearerEvents()
{
OnMessageReceived
= cOntext=>
{
context.Token
= context.Request.Query["access_token"];
return Task.CompletedTask;
},
OnAuthenticationFailed
= cOntext=>
{
// 如果过期,则把<是否过期>添加到,返回头信息中
if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
{
context.Response.Headers.Add(
"Token-Expired", "true");
}
return Task.CompletedTask;
}
};
});

三、新建一个控制器,用于模拟登录,返回Token

public class Authorization : Controller
{
[HttpGet(
"GetToken")]
public string GetToken() {
//载荷增加用户
var claims = new[] {
new Claim(ClaimTypes.Name,"yinmingneng"),
new Claim(ClaimTypes.Email,"123@qq.com")
};
//加密密钥
var key = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(TokenConfig.secret));
///签名
var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var jwttoken = new JwtSecurityToken(TokenConfig.issuer,TokenConfig.audience, claims, DateTime.Now
,DateTime.Now.AddMinutes(TokenConfig.accessExpiration),credentials);
var token = new JwtSecurityTokenHandler().WriteToken(jwttoken);
return token;
}

}

 

四、测试Token,新建一个控制器,控制器上增加[Authorize]权限认证,增加表示必须携带Token才能访问

[ApiController]
[Route(
"[controller]")]
[Authorize]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger _logger;
public WeatherForecastController(ILogger logger)
{
_logger
= logger;
}
[HttpGet(Name
= "GetWeatherForecast")]
public IEnumerable Get()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date
= DateTime.Now.AddDays(index),
TemperatureC
= Random.Shared.Next(-20, 55),
Summary
= Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}

五、测试、获取Token访问方法

 

 

 

使用Token,访问,如果不携带会提示无权限访问,比如

 

 

 

携带Token访问,

 

 

 

 



推荐阅读
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • 本文介绍了Windows Vista操作系统中的用户账户保护功能,该功能是为了增强系统的安全性而设计的。通过对Vista测试版的体验,可以看到系统在安全性方面的进步。该功能的引入,为用户的账户安全提供了更好的保障。 ... [详细]
author-avatar
手机用户2702936363
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有