引入ナゲット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(1970、1、1、0、0、0、TimeSpan.Zero))TotalSeconds);.