using System; using System.IdentityModel.Tokens.Jwt; using System.Net; using System.Threading.Tasks; using EasyCaching.Core; using IRaCIS.Application; using IRaCIS.Core.Domain.Share; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; namespace IRaCIS.WX.CoreApi.Auth { public class AuthMiddleware { private readonly RequestDelegate _next; private readonly IEasyCachingProvider _provider; public AuthMiddleware(RequestDelegate next, IEasyCachingProvider provider) { _next = next; _provider = provider; } public async Task Invoke(HttpContext httpContext) { var isLogin = httpContext.Request.Path.ToString().ToLower().Contains("login"); var result = await httpContext.AuthenticateAsync(JwtBearerDefaults.AuthenticationScheme); if (!isLogin) { if (!result.Succeeded) { httpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized; await httpContext.Response.WriteAsync("Unauthorized"); } else { var toekn = result.Properties.Items[".Token.access_token"]; var jwtHandler = new JwtSecurityTokenHandler(); JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(toekn); object userId; jwtToken.Payload.TryGetValue("id", out userId); var cacheValueExist = await _provider.ExistsAsync(userId.ToString()); //Get(userId.ToString()).ToString(); if (!cacheValueExist) { httpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized; await httpContext.Response.WriteAsync("Unauthorized"); } else { await _provider.SetAsync(userId.ToString(), userId.ToString(), TimeSpan.FromMinutes(SystemConfig.LoginExpiredTimeSpan)); httpContext.User = result.Principal; await _next.Invoke(httpContext); } } } else await _next.Invoke(httpContext); } } }