67 lines
2.5 KiB
C#
67 lines
2.5 KiB
C#
using System;
|
|
using System.IdentityModel.Tokens.Jwt;
|
|
using System.Net;
|
|
using System.Threading.Tasks;
|
|
using EasyCaching.Core;
|
|
using IRaCIS.Core.Domain.Share;
|
|
using Microsoft.AspNetCore.Authentication;
|
|
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
|
using Microsoft.AspNetCore.Http;
|
|
|
|
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;
|
|
}
|
|
/// <summary>
|
|
///为了前端 一段时间无操作,需要重新登陆
|
|
/// </summary>
|
|
/// <param name="httpContext"></param>
|
|
/// <returns></returns>
|
|
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<string>(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(15));
|
|
httpContext.User = result.Principal;
|
|
await _next.Invoke(httpContext);
|
|
}
|
|
}
|
|
}
|
|
else await _next.Invoke(httpContext);
|
|
}
|
|
}
|
|
}
|