Asp.netコアJsonWebToken記録

引入ナゲットMicrosoft.AspNetCore.Authentication.JwtBearer

起動中

 app.UseAuthentication();
      #region JWT 
            //读取配置文件
            services.Configure <TokenManagement>(Configuration.GetSection( "tokenManagement")); 
            。VARトークン= Configuration.GetSection( "tokenManagement")を取得<TokenManagement>(); 
            //注入JWT 
            services.AddAuthentication(X => 
            { 
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; 
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; 
            })。AddJwtBearer(X => 
            { 
                x.RequireHttpsMetadata = FALSE; 
                x.SaveToken = TRUE; 
                X 。 
                {
                    ValidateIssuerSigningKey = TRUE、
                    IssuerSigningKey =新しいSymmetricSecurityKey(Encoding.ASCII.GetBytes(token.Secret))、
                    ValidIssuer = token.Issuer、
                    ValidAudience = token.Audience、
                    ValidateIssuer =偽、
                    ValidateAudience = FALSE 
                ;} 

            }); 
            //权限注入
            services.AddScoped <IAuthenticateService、TokenAuthenticationService>(); 
            //验证是否有权限
            services.AddScoped <IUserService、UserServiceの>(); 
            #endregion

  appsettings.jsonでプロファイル

 TokenManagement :{
     秘密は123456123456123456 //は、秘密鍵の長さを見つけることが、最新のHS256アルゴリズム128で、少なくとも16個の文字が文字に変換され
    、「発行者をwebapi.cn 観客WEBAPI " accessExpiration "30 " refreshExpiration "60 
  }
// JWT实体配置
パブリック
クラスTokenManagement { [JsonProperty(" 秘密" )] パブリック 文字列シークレット{ 取得しますセット; } [JsonProperty(" 発行者" )] パブリック 文字列発行{ 得ますセット; } [JsonProperty(" 観客" )] パブリック 文字列オーディエンス{ GETセット; } [JsonProperty("accessExpiration " )] パブリック int型 AccessExpiration { 得る ; セット;} [JsonProperty(" refreshExpiration " )] パブリック int型 RefreshExpiration { 得る ; セット;} }
//登陆验证返回トークン信息
公共 BOOLにisAuthenticated(LoginRequestDTO要求、アウト 文字列トークン) { トークン = ストリング.Empty。 もし(!_userService.IsValid(リクエスト)) リターン はfalse ; VaRのクレーム= 新しい[] { 新しい項(ClaimTypes.Name、request.Username) }。 VaRのキー= 新しいSymmetricSecurityKey(Encoding.UTF8.GetBytes(_tokenManagement.Secret)); VaRの資格情報= 新しいですSigningCredentials(キー、SecurityAlgorithms.HmacSha256)。 VAR jwtTokenは= 新しいJwtSecurityToken(_tokenManagement.Issuer、 _tokenManagement.Audience、 主張を、 期限が切れる:DateTime.Now.AddMinutes(_tokenManagement.AccessExpiration)、 signingCredentials:資格情報)を、 トークン = 新しいJwtSecurityTokenHandler()WriteToken(jwtToken)。 返す ; }
//获取トークン信息
パブリック 静的 LoginRequestDTOのUserInfo(これのHttpContext httpcontent) { LoginRequestDTOユーザー = NULL ; VaRのデータ= httpcontent.Request。 VAR handerResult = httpcontent.Request.Headers [ " 承認" ] .ToString()(交換。" ベアラを""" ); もし(!文字列.IsNullOrEmpty(handerResult)) { VAR dataResult =検証(handerResult、ペイロード=> { ユーザー = 新しいLoginRequestDTO()。 user.Username =ペイロード[ClaimTypes.Name]?.ToString(); 返す ; }); } 戻りユーザ、 } パブリック 静的 ブール検証(文字列 encodeJwt、のFunc <辞書< 文字列オブジェクト >、BOOL > validatePayLoad) { VARの成功= VAR= encodeJwt.Split jwtArr(' ' ); VARヘッダ= JsonConvert.DeserializeObject <辞書< 文字列オブジェクト >>(Base64UrlEncoder.Decode(jwtArr [ 0 ])); VARの PAYLOAD = JsonConvert.DeserializeObject <辞書< 文字列オブジェクト > >(Base64UrlEncoder.Decode(jwtArr [ 1 ])); // 構成情報のvar hs256 = 新しい新しい HMACSHA256(Encoding.ASCII.GetBytes(" 123456123456123456 " )); // 署名が正しい最初の検証(必須) && =成功成功ストリング .Equals(jwtArr [ 2 ]、Base64UrlEncoder.Encode(hs256.ComputeHash(Encoding.UTF8.GetBytes(文字列 .Concat(jwtArr [ 0 ]、" "、jwtArr [ 1 ])))))。 IF(!成功) { 返す成功; // 不正な署名が直接返さ } // 第二には、有効期間(あるべき)以内に確認するVAR今= ; ToUnixEpochDate(DateTime.UtcNow) 成功 =成功&&(今< ロング .Parse (ペイロード[ " EXP " ] .ToString())); // その後、カスタム検証のために続いて 成功成功= && validatePayLoad(ペイロード); 戻り成功; } パブリック 静的 ロング ToUnixEpochDate(日付と時刻DATE)=> ロング)恐らくMath.round((DATE。 ToUniversalTime() - 新しい新規のDateTimeOffset(197011000、TimeSpan.Zero))TotalSeconds);.

おすすめ

転載: www.cnblogs.com/zxp6/p/12210544.html