最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.net core webapi jwt 更為清爽的認(rèn)證詳解

 更新時(shí)間:2019年05月26日 10:14:41   作者:FreeTimeWorker  
這篇文章主要介紹了.net core webapi jwt 更為清爽的認(rèn)證詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

我的方式非主流,控制卻可以更加靈活,喜歡的朋友,不妨花一點(diǎn)時(shí)間學(xué)習(xí)一下

jwt認(rèn)證分為兩部分,第一部分是加密解密,第二部分是靈活的應(yīng)用于中間件,我的處理方式是將獲取token放到api的一個(gè)具體的controller中,將發(fā)放token與驗(yàn)證分離,token的失效時(shí)間,發(fā)證者,使用者等信息存放到config中。

1.配置:

在appsettings.json中增加配置

"Jwt": {
"Issuer": "issuer",//隨意定義
"Audience": "Audience",//隨意定義
"SecretKey": "abc",//隨意定義
"Lifetime": 20, //單位分鐘
"ValidateLifetime": true,//驗(yàn)證過(guò)期時(shí)間
"HeadField": "useless", //頭字段
"Prefix": "prefix", //前綴
"IgnoreUrls": [ "/Auth/GetToken" ]//忽略驗(yàn)證的url
}

2:定義配置類:

internal class JwtConfig
  {
    public string Issuer { get; set; }
    public string Audience { get; set; }

    /// <summary>
    /// 加密key
    /// </summary>
    public string SecretKey { get; set; }
    /// <summary>
    /// 生命周期
    /// </summary>
    public int Lifetime { get; set; }
    /// <summary>
    /// 是否驗(yàn)證生命周期
    /// </summary>
    public bool ValidateLifetime { get; set; }
    /// <summary>
    /// 驗(yàn)證頭字段
    /// </summary>
    public string HeadField { get; set; }
    /// <summary>
    /// jwt驗(yàn)證前綴
    /// </summary>
    public string Prefix { get; set; }
    /// <summary>
    /// 忽略驗(yàn)證的url
    /// </summary>
    public List<string> IgnoreUrls { get; set; }
  }

3.加密解密接口:

 public interface IJwt
  {
    string GetToken(Dictionary<string, string> Clims);
    bool ValidateToken(string Token,out Dictionary<string ,string> Clims);
  }

4.加密解密的實(shí)現(xiàn)類:

install -package System.IdentityModel.Tokens.Jwt

 public class Jwt : IJwt
  {
    private IConfiguration _configuration;
    private string _base64Secret;
    private JwtConfig _jwtConfig = new JwtConfig();
    public Jwt(IConfiguration configration)
    {
      this._configuration = configration;
      configration.GetSection("Jwt").Bind(_jwtConfig);
      GetSecret();
    }
    /// <summary>
    /// 獲取到加密串
    /// </summary>
    private void GetSecret()
    {
      var encoding = new System.Text.ASCIIEncoding();
      byte[] keyByte = encoding.GetBytes("salt");
      byte[] messageBytes = encoding.GetBytes(this._jwtConfig.SecretKey);
      using (var hmacsha256 = new HMACSHA256(keyByte))
      {
        byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
        this._base64Secret= Convert.ToBase64String(hashmessage);
      }
    }
    /// <summary>
    /// 生成Token
    /// </summary>
    /// <param name="Claims"></param>
    /// <returns></returns>
    public string GetToken(Dictionary<string, string> Claims)
    {
      List<Claim> claimsAll = new List<Claim>();
      foreach (var item in Claims)
      {
        claimsAll.Add(new Claim(item.Key, item.Value));
      }
      var symmetricKey = Convert.FromBase64String(this._base64Secret);
      var tokenHandler = new JwtSecurityTokenHandler();
      var tokenDescriptor = new SecurityTokenDescriptor
      {
        Issuer = _jwtConfig.Issuer,
        Audience = _jwtConfig.Audience,
        Subject = new ClaimsIdentity(claimsAll),
        NotBefore = DateTime.Now,
        Expires = DateTime.Now.AddMinutes(this._jwtConfig.Lifetime),
        SigningCredentials =new SigningCredentials(new SymmetricSecurityKey(symmetricKey),
                      SecurityAlgorithms.HmacSha256Signature)
      };
      var securityToken = tokenHandler.CreateToken(tokenDescriptor);
      return tokenHandler.WriteToken(securityToken);
    }
    public bool ValidateToken(string Token, out Dictionary<string, string> Clims)
    {
      Clims = new Dictionary<string, string>();
      ClaimsPrincipal principal = null;
      if (string.IsNullOrWhiteSpace(Token))
      {
        return false;
      }
      var handler = new JwtSecurityTokenHandler();
      try
      {
        var jwt = handler.ReadJwtToken(Token);

        if (jwt == null)
        {
          return false;
        }
        var secretBytes = Convert.FromBase64String(this._base64Secret);
        var validationParameters = new TokenValidationParameters
        {
          RequireExpirationTime = true,
          IssuerSigningKey = new SymmetricSecurityKey(secretBytes),
          ClockSkew = TimeSpan.Zero,
          ValidateIssuer = true,//是否驗(yàn)證Issuer
          ValidateAudience = true,//是否驗(yàn)證Audience
          ValidateLifetime = this._jwtConfig.ValidateLifetime,//是否驗(yàn)證失效時(shí)間
          ValidateIssuerSigningKey = true,//是否驗(yàn)證SecurityKey
          ValidAudience = this._jwtConfig.Audience,
          ValidIssuer = this._jwtConfig.Issuer
        };
        SecurityToken securityToken;
        principal = handler.ValidateToken(Token, validationParameters, out securityToken);
        foreach (var item in principal.Claims)
        {
          Clims.Add(item.Type, item.Value);
        }
        return true;
      }
      catch (Exception ex)
      {
        return false;
      }
    }
  }

5.定義獲取Token的Controller:

在Startup.ConfigureServices中注入 IJwt

services.AddTransient<IJwt, Jwt>(); // Jwt注入

[Route("[controller]/[action]")]
  [ApiController]
  public class AuthController : ControllerBase
  {
    private IJwt _jwt;
    public AuthController(IJwt jwt)
    {
      this._jwt = jwt;
    }
    /// <summary>
    /// getToken
    /// </summary>
    /// <returns></returns>
    [HttpPost]
    public IActionResult GetToken()
    {
      if (true)
      {
        Dictionary<string, string> clims = new Dictionary<string, string>();
        clims.Add("userName", userName);
        return new JsonResult(this._jwt.GetToken(clims));
      }
    }
  }

6.創(chuàng)建中間件:

 public class UseJwtMiddleware
  {
    private readonly RequestDelegate _next;
    private JwtConfig _jwtConfig =new JwtConfig();
    private IJwt _jwt;
    public UseJwtMiddleware(RequestDelegate next, IConfiguration configration,IJwt jwt)
    {
      _next = next;
      this._jwt = jwt;
      configration.GetSection("Jwt").Bind(_jwtConfig);
    }
    public Task InvokeAsync(HttpContext context)
    {
      if (_jwtConfig.IgnoreUrls.Contains(context.Request.Path))
      {
        return this._next(context);
      }
      else
      {
        if (context.Request.Headers.TryGetValue(this._jwtConfig.HeadField, out Microsoft.Extensions.Primitives.StringValues authValue))
        {
          var authstr = authValue.ToString();
          if (this._jwtConfig.Prefix.Length > 0)
          {
            authstr = authValue.ToString().Substring(this._jwtConfig.Prefix.Length+1, authValue.ToString().Length -(this._jwtConfig.Prefix.Length+1));
          }
          if (this._jwt.ValidateToken(authstr, out Dictionary<string, string> Clims))
          {
            foreach (var item in Clims)
            {
              context.Items.Add(item.Key, item.Value);
            }
            return this._next(context);
          }
          else
          {
            context.Response.StatusCode = 401;
            context.Response.ContentType = "application/json";
            return context.Response.WriteAsync("{\"status\":401,\"statusMsg\":\"auth vaild fail\"}");
          }
        }
        else
        {
          context.Response.StatusCode = 401;
          context.Response.ContentType = "application/json";
          return context.Response.WriteAsync("{\"status\":401,\"statusMsg\":\"auth vaild fail\"}");
        }
      }
    }
  }

7.中間件暴露出去

public static class UseUseJwtMiddlewareExtensions
  {
    /// <summary>
    /// 權(quán)限檢查
    /// </summary>
    /// <param name="builder"></param>
    /// <returns></returns>
    public static IApplicationBuilder UseJwt(this IApplicationBuilder builder)
    {
      return builder.UseMiddleware<UseJwtMiddleware>();
    }
  }

8.在Startup.Configure中使用中間件:

app.UseJwt();

以1的配置為例:

除了請(qǐng)求 /auth/getToken 不需要加頭信息外,其他的請(qǐng)求一律要求頭信息中必須帶著

userless:prefix (從Auth/GetToken中獲取到的token)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • ASP.net實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的方法

    ASP.net實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的方法

    在ASP.NET進(jìn)行頁(yè)面開發(fā)時(shí)候經(jīng)常遇到需要進(jìn)行頁(yè)面跳轉(zhuǎn)的操作。這個(gè)其實(shí)并不難,關(guān)鍵是知不知道的問(wèn)題。下面給出操作方法。
    2013-06-06
  • ASP.NET Core3.1 Ocelot負(fù)載均衡的實(shí)現(xiàn)

    ASP.NET Core3.1 Ocelot負(fù)載均衡的實(shí)現(xiàn)

    這篇文章主要介紹了ASP.NET Core3.1 Ocelot負(fù)載均衡的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • ASP.NET Forms身份認(rèn)證詳解

    ASP.NET Forms身份認(rèn)證詳解

    在這篇文章中,不會(huì)涉及ASP.NET的登錄系列控件以及membership的相關(guān)話題,我只想用比較原始的方式來(lái)說(shuō)明在ASP.NET中是如何實(shí)現(xiàn)身份認(rèn)證的過(guò)程。
    2015-09-09
  • asp.net用三層實(shí)現(xiàn)多條件檢索示例

    asp.net用三層實(shí)現(xiàn)多條件檢索示例

    三層將項(xiàng)目分為界面層,業(yè)務(wù)邏輯層和數(shù)據(jù)訪問(wèn)層,下面為大家介紹下asp.net如何用三層實(shí)現(xiàn)多條件檢索,感興趣的朋友可以參考下
    2014-07-07
  • 解決asp.net core在輸出中文時(shí)亂碼的問(wèn)題

    解決asp.net core在輸出中文時(shí)亂碼的問(wèn)題

    最近在學(xué)習(xí)asp.net core的時(shí)候,嘗試在控制臺(tái),或者頁(yè)面上輸出中文,會(huì)出現(xiàn)亂碼的問(wèn)題。那么這該如何解決呢?下面通過(guò)這篇文章來(lái)一起看看吧,文中給出了詳細(xì)的解決方法,相信對(duì)大家有一定的參考價(jià)值。
    2016-12-12
  • .Net插件框架Managed Extensibility Framework簡(jiǎn)介

    .Net插件框架Managed Extensibility Framework簡(jiǎn)介

    這篇文章介紹了.Net插件框架Managed Extensibility Framework,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • asp.net GridView模板列中實(shí)現(xiàn)選擇行功能

    asp.net GridView模板列中實(shí)現(xiàn)選擇行功能

    近來(lái)在項(xiàng)目中用到了GridView控件,用它實(shí)現(xiàn)添加、修改、刪除、選擇、顯示復(fù)雜表頭等功能
    2010-07-07
  • Blazor組件的生命周期解析

    Blazor組件的生命周期解析

    這篇文章介紹了Blazor組件的生命周期,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • ASP.NET MVC實(shí)現(xiàn)文件下載

    ASP.NET MVC實(shí)現(xiàn)文件下載

    這篇文章介紹了ASP.NET MVC實(shí)現(xiàn)文件下載的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • .NET+Sqlite支持加密的操作方法

    .NET+Sqlite支持加密的操作方法

    這篇文章主要介紹了.NET+Sqlite如何支持加密,如果想支持登錄加密,需要另外的擴(kuò)展SQLite?加密擴(kuò)展(SQLite?Encryption?Extension,),具有讀取/寫入?AES?加密數(shù)據(jù)庫(kù)的附加功能,需要的朋友可以參考下
    2021-12-12

最新評(píng)論

遂川县| 涪陵区| 长海县| 苍山县| 龙岩市| 永清县| 赞皇县| 乌拉特后旗| 芮城县| 桐柏县| 稻城县| 尼勒克县| 高要市| 保德县| 屏东市| 阿荣旗| 虹口区| 遂平县| 大冶市| 陆河县| 独山县| 榆林市| 乡城县| 理塘县| 全椒县| 神木县| 铜梁县| 犍为县| 聂荣县| 偃师市| 金乡县| 安化县| 秭归县| 涿鹿县| 绍兴县| 铁岭市| 元谋县| 巨鹿县| 鸡东县| 尼勒克县| 南通市|