public class RestrictUserMiddleware { public readonly RequestDelegate _next; private ILogger _logger; public ICacheService cacheService; public RestrictUserMiddleware(RequestDelegate next, ILogger<GlobalExceptionCatchMiddleware> logger, IServiceProvider service) { _next = next; _logger = logger; cacheService = (MemoryCacheService)service.GetService(typeof(MemoryCacheService)); } public async Task Invoke(HttpContext context) { var user = context.User.Claims.Where(i => i.Type == ConfigHelper.Claim_UserName).FirstOrDefault(); var path = context.Request.Path.Value; //呼叫端用户互踢处理 if (user != null && path.Contains("xxxxService/CallingClient")) { var token = context.Request.Headers["Authorization"].ToString(); var username = user.Value; if (cacheService.Exists(username)) { var c_token = cacheService.GetValue(username); var exists = cacheService.Exists(token); if (exists) { context.Response.Clear(); context.Response.StatusCode = StatusCodes.Status200OK; var responseResult = ResponseResult<object>.Expire("Expire"); var responseStr = JsonConvert.SerializeObject(responseResult, Formatting.None, new JsonSerializerSettings { ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver() }); context.Response.ContentType = "application/json;charset=utf-8"; await context.Response.WriteAsync(responseStr); } else if (token != c_token) { cacheService.Add(c_token, 1); cacheService.Add(username, token); } } else { cacheService.Add(username, token); } } await _next(context); } }
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {//使用Token验证 app.UseAuthentication(); app.UseAuthorization(); app.UseRestrictUserMiddleware();
}
cache记录token,旧token,则阻止防护正确结果