华域联盟 .Net ASP.NET Core使用JWT认证授权的方法

ASP.NET Core使用JWT认证授权的方法

ASP.NET Core使用JWT认证授权的方法
 更新时间:2020年11月05日 08:30:49   作者:菜鸟客栈  

这篇文章主要介绍了ASP.NET Core使用JWT认证授权的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

 demo地址: github.com/william0705/JWTS
名词解析

认证 : 识别用户是否合法
授权: 赋予用户权限 (能访问哪些资源)
鉴权: 鉴定权限是否合法
Jwt优势与劣势

优势

1、 无状态
token 存储身份验证所有信息 , 服务端不需要保存用户身份验证信息, 减少服务端压力 , 服务端更容易水平扩展, 由于无状态, 又会导致它最大缺点 , 很难注销
2、 支持跨域访问
Cookie是不允许垮域访问的,token支持
3、 跨语言
基于标准化的 JSON Web Token (JWT) , 不依赖特定某一个语言 , 例如生成的Token可以对多种语言使用(Net , Java , PHP …)
劣势

1、Token有效性问题
后台很难注销已经发布的Token , 通常需要借助第三方储存(数据库/缓存) 实现注销, 这样就会失去JWT最大的优势
2、占带宽
Token长度(取决存放内容) 比session_id大 , 每次请求多消耗带宽 , token只存必要信息 , 避免token过长
3、需要实现续签
cookies – session 通常是框架已经实现续签功能, 每次访问把过期时间更新, JWT需要自己实现, 参考OAuth2刷新Token机制实现刷新Token
4、消耗更多CPU
每次请求需要对内容解密和验证签名这两步操作,典型用时间换空间

只能根据自身使用场景决定使用哪一种身份验证方案 , 没有一种方案是通用的,完美的

.NET Core集成JWT认证授权服务
1、认证服务API:认证用户,并发布Token
1、引入nuget包,System.IdentityModel.Tokens.Jwt
2、创建生成Token的服务,建议使用面向接口和实现编程,方便服务注入容器ServicesCollection(涉及DI和IOC概念)
3、创建接口

namespace JWTS.Services
{
public interface IJWTService
{
/// <summary>
/// 根据验证通过后的用户以及角色生成Token,以达到角色控制的作用
/// </summary>
/// <param name="userName"></param>
/// <param name="role"></param>
/// <returns></returns>
string GetToken(string userName,string role);
}
}

4、在appsettings.config中添加生成token需要的信息,并映射成对象

"TokenParameter": {
"Issuer": "William", //这个JWT的签发主体(发行者)
"Audience": "William", //这个JWT的接收对象
"SecurityKey": "askalsnlkndhasnaslkasmadka"
}

  public class TokenParameter
  {
    public string Issuer { get; set; }
    public string Audience { get; set; }
    public string SecurityKey { get; set; }
  }

5、实现接口,注入Configuration,获取TokenParameter对象

using Microsoft.Extensions.Configuration;
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;

namespace JWTS.Services
{
public class JWTService : IJWTService
{
private readonly TokenParameter _tokenParameter;
      public JWTService(IConfiguration configuration)
      {
        _tokenParameter = configuration.GetSection("TokenParameter").Get<TokenParameter>();
      }
     /// <summary>
/// JWT由三部分组成(Header、Payload、Signature)
/// {Header}.{Payload}.{Signature}
/// </summary>
/// <param name="userName"></param>
/// <param name="role"></param>
/// <returns></returns>
public string GetToken(string userName,string role)
{
Claim[] claims = new[] {
new Claim(ClaimTypes.Name, userName),
new Claim("NickName","Richard"),
new Claim("Role",role)//传递其他信息
};
SymmetricSecurityKey key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_tokenParameter.SecurityKey));
SigningCredentials creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
/**
* Claims (Payload)
Claims 部分包含了一些跟这个 token 有关的重要信息。 JWT 标准规定了一些字段,下面节选一些字段:
JWT会被加密,但是这部分内容任何人都可以读取,所以不要存放机密信息

iss: The issuer of the token,token 是给谁的
sub: The subject of the token,token 主题
exp: Expiration Time。 token 过期时间,Unix 时间戳格式
iat: Issued At。 token 创建时间, Unix 时间戳格式
jti: JWT ID。针对当前 token 的唯一标识
除了规定的字段外,可以包含其他任何 JSON 兼容的字段。
* */
var token = new JwtSecurityToken(
issuer: _tokenParameter.Issuer,
audience: _tokenParameter.Audience,
claims: claims,
expires: DateTime.Now.AddMinutes(10),//10分钟有效期
signingCredentials: creds);
string returnToken = new JwtSecurityTokenHandler().WriteToken(token);
return returnToken;
}
}
}

6、jwt中定义好的Claims

JWT标准里面定好的claim有:

iss(Issuser):代表这个JWT的签发主体;
sub(Subject):代表这个JWT的主体,即它的所有人;
aud(Audience):代表这个JWT的接收对象;
exp(Expiration time):是一个时间戳,代表这个JWT的过期时间;
nbf(Not Before):是一个时间戳,代表这个JWT生效的开始时间,意味着在这个时间之前验证JWT是会失败的;
iat(Issued at):是一个时间戳,代表这个JWT的签发时间;
jti(JWT ID):是JWT的唯一标识。

7、在鉴权项目工程Startup.cs文件里依赖注入JWT的服务类

public void ConfigureServices(IServiceCollection services) { services.AddScoped <IJWTService, JWTService> (); services.AddControllers(); }

8、添加AuthenticationController,生成Token,后期可以添加RefreshToken

using JWTS.Services;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;

namespace JWTS.Controllers
{
[Route("api/[controller]")] [ApiController] public class AuthenticationController : ControllerBase
{
#region 构造函数
private ILogger<AuthenticationController> _logger;
private IJWTService _iJWTService;
private readonly IConfiguration _iConfiguration;
public AuthenticationController(ILogger<AuthenticationController> logger,
IConfiguration configuration
, IJWTService service)
{
_logger = logger;
_iConfiguration = configuration;
_iJWTService = service;
}
#endregion

/// <summary>
/// 实际场景使用Post方法
/// localhost:5000/api/Authentication/Login?name=william&password=123123
/// </summary>
/// <param name="name"></param>
/// <param name="password"></param>
/// <returns></returns>
[Route("Login")] [HttpGet] public IActionResult Login(string name, string password)
{
//这里应该是需要去连接数据库做数据校验,为了方便所有用户名和密码写死了
if ("william".Equals(name) && "123123".Equals(password))//应该数据库
{
var role = "Administrator";//可以从数据库获取角色
string token = this._iJWTService.GetToken(name, role);
return new JsonResult(new
{
result = true,
token
});
}

return Unauthorized("Not Register!!!");
}
}
}

2、资源中心API:使用从认证服务中心获取的Token,去访问资源,资源中心对用户信息以及Token进行鉴权操作,认证失败返回401
1、资源中心添加Nuget包(Microsoft.AspNetCore.Authentication.JwtBearer)
2、添加Authentication服务,添加JwtBearer,通过Configuration获取TokenParameter对象

using System;
using System.Text;
using API.Core.Models;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.IdentityModel.Tokens;

namespace API.Core
{
public class Startup
{
private TokenParameter _tokenParameter;
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
_tokenParameter = configuration.GetSection("TokenParameter").Get<TokenParameter>()??throw new ArgumentNullException(nameof(_tokenParameter));
}

public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)//默认授权机制
.AddJwtBearer(options =>
{
options.TokenValidationParameters=new TokenValidationParameters()
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = _tokenParameter.Issuer,
ValidAudience = _tokenParameter.Audience,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_tokenParameter.SecurityKey))
};
});
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}

3、在资源控制器上添加[Authorize]属性,以启用认证授权访问API资源

   [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<WeatherForecastController> _logger;

public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}

[HttpGet] public IEnumerable<WeatherForecast> Get()
{
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)] })
.ToArray();
}
}

到此这篇关于ASP.NET Core使用JWT认证授权的方法的文章就介绍到这了,更多相关ASP.NET Core JWT认证授权 内容请搜索华域联盟以前的文章或继续浏览下面的相关文章希望大家以后多多支持华域联盟!

您可能感兴趣的文章:ASP.NET Core3.1 Ocelot认证的实现深入解读ASP.NET Core身份认证过程实现ASP.NET Core 实现基本认证的示例代码ASP.NET Core学习之使用JWT认证授权详解ASP.NET Core Authentication认证实现方法Asp.net Core中实现自定义身份认证的示例代码浅谈ASP.NET Core 中jwt授权认证的流程原理ASP.Net Core3.0中使用JWT认证的实现Asp.Net Core基于JWT认证的数据接口网关实例代码ASP.NET学习CORE中使用Cookie身份认证方法Asp.Net Core添加请求头自定义认证的示例

ASP.NET
Core
JWT
认证

相关文章
ASP.Net 分页控件源码由于.net自带的分页功能极其死板,自定义性不强不能满足需求
俺花了一个多星期的时间 写成的一个.net分页控件 2007-03-03
.NET Core日志配置的方法熟悉ASP.NET的开发者一定对web.config文件不陌生,这篇文章主要介绍了.NET Core日志配置的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 2018-08-08
ASP.NET 常用 文件上传方法文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法 2009-07-07
先装了FRAMEWORK,后装IIS导致asp.net页面无法访问的解决方法如果先装了FRAMEWORK,后装IIS。有可能没有在IIS中注册,就会导致在页面中无法访问的情况 2012-01-01
asp.net 定时间点执行任务的简易解决办法这里的定时间点执行任务,指的是每天的某个时间执行一项任务。 2009-12-12
.NET/ASP.NET Routing路由(深入解析路由系统架构原理)这篇文章主要介绍了.NET/ASP.NET Routing路由(深入解析路由系统架构原理),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 2018-07-07
解决asp.net Sharepoint无法连接发布自定义字符串处理程序,不能进解决Sharepoint无法连接发布自定义字符串处理程序,不能进行输出缓存处理的方法 2010-03-03
VS2015 update2安装历程本文给大家分享的是VS2015 update2的坑爹的安装历程,简直是虐爹一百次,不过话说回来VS的Android模拟器真是流畅到爆啊,希望本文能对小伙伴们有所帮助 2016-07-07
如何在Asp.Net Core MVC中处理null值的实现这篇文章主要介绍了如何在Asp.Net Core MVC中处理null值的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 2020-12-12
把ASP.NET MVC项目部署到本地IIS上的完整步骤最近会经常修改一些网站前端的内容,为了方便跟UI和产品交流,需要将自己修改过的页面及时发布到测试机或者是本地的IIS上。下面这篇文章主要给大家介绍了关于如何把ASP.NET MVC项目部署到本地IIS上的相关资料,需要的朋友可以参考下 2018-06-06

最新评论

本文由 华域联盟 原创撰写:华域联盟 » ASP.NET Core使用JWT认证授权的方法

转载请保留出处和原文链接:https://www.cnhackhy.com/5036.htm

本文来自网络,不代表华域联盟立场,转载请注明出处。

作者:

发表回复

联系我们

联系我们

2551209778

在线咨询: QQ交谈

邮箱: [email protected]

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部