加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

ASP.NET Core行使JWT认证授权的要领

发布时间:2020-11-23 07:51:27 所属栏目:站长百科 来源:网络整理
导读:这篇文章首要先容了ASP.NET Core行使JWT认证授权的要领,文中通过示例代码先容的很是具体,对各人的进修可能事变具有必然的参考进修代价,必要的伴侣们下面跟着小
副问题[/!--empirenews.page--]

  短视频,自媒体,达人种草一站处事

这篇文章首要先容了ASP.NET Core行使JWT认证授权的要领,文中通过示例代码先容的很是具体,对各人的进修可能事变具有必然的参考进修代价,必要的伴侣们下面跟着小编来一路进修进修吧

demo地点: https://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></param>
    /// <param></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></param>
    /// <param></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

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读