.Net 实操将Token存入Session

一、参考

.NET Session - 掘金 (juejin.cn)

.NET 让Swagger中带JWT报文头 - 掘金 (juejin.cn)

.NET ActionFilter行为过滤器 - 掘金 (juejin.cn)

二、环境搭建

2.1 依赖下载

Microsoft.AspNetCore.Session

2.2 服务注册

主要注册了过滤器ActionApiFilter,JWT请求头和Session服务

ini 复制代码
using Microsoft.AspNetCore.Http;
using Microsoft.OpenApi.Models;
using Token1;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(s =>
{
    //添加安全定义
    s.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
    {
        Description = "请输入token,格式为 Bearer xxxxxxxx(注意中间必须有空格)",
        Name = "Authorization",
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.ApiKey,
        BearerFormat = "JWT",
        Scheme = "Bearer"
    });
    //添加安全要求
    s.AddSecurityRequirement(new OpenApiSecurityRequirement {
        {
            new OpenApiSecurityScheme{
                Reference =new OpenApiReference{
                    Type = ReferenceType.SecurityScheme,
                    Id ="Bearer"
                }
            },new string[]{ }
        }
    });
});

builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.AddDistributedMemoryCache();
builder.Services.AddSession();

builder.Services.AddControllers(o => o.Filters.Add(typeof(ActionApiFilter)));

var app = builder.Build();
app.UseSession();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

2.3 创建过滤器

当用户的请求头中捎带了Token时,就将其存入Session

csharp 复制代码
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System.Net.WebSockets;

namespace Token1
{
    public class ActionApiFilter : ControllerBase, IAsyncActionFilter
    {

        private readonly ILogger<ActionApiFilter> logger;
        private readonly IHttpContextAccessor httpContextAccessor_;
        public ActionApiFilter(ILogger<ActionApiFilter> logger, IHttpContextAccessor httpContextAccessor_)
        {
            this.logger = logger;
            this.httpContextAccessor_ = httpContextAccessor_;
        }

        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            string token = context.HttpContext.Request.Headers["Authorization"].ToString();
            if (!string.IsNullOrEmpty(token))
            {
                string value = token.Split(' ').Last();
                await Console.Out.WriteLineAsync($"token:" + value);
                // 存入session
                httpContextAccessor_.HttpContext.Session.SetString("value", value);
            }
            else
            {
                await Console.Out.WriteLineAsync($"no token");
            }
            ActionExecutedContext actionExecutedContext = await next.Invoke();
        }
    }
}

2.4 创建控制器

创建了Set和Get方法,模拟Session的存取

csharp 复制代码
using Microsoft.AspNetCore.Mvc;

namespace Token1.Controllers
{
    [ApiController]
    [Route("[controller]/[action]")]
    public class Test : ControllerBase
    {

        [HttpGet]
        public void Set()
        {
        }

        [HttpGet]
        public object Get()
        {
            return HttpContext.Session.GetString("value");
        }
    }
}

三、测试

填写token信息,此后每次加载请求头都会捎带

此时Seesion已存入token

注销请求头,去除Get对Set的影响(如果不注销,那么Get方法也会捎带token,会覆盖Set内容)

成功获取

此时再用postman测试一次,模拟不同用户访问

成功获取对应token

此时再访问用户1,内容不变,表明不同用户存取的session不同

相关推荐
小蒜学长1 小时前
基于Spring Boot+Vue3的在线医疗咨询系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·在线问诊·在线医疗咨询系统
陈随易2 小时前
下载神器!Motrix 停更三年后重写回归
前端·后端·程序员
每天一道题2 小时前
CAP、Raft 与多数派:分布式系统如何达成一致?
分布式·后端·微服务
前端的日常2 小时前
一个人+AI做情侣食谱小程序,0 费用的服务器
前端·后端
IT_陈寒3 小时前
Vue的v-for里用了个临时变量,页面直接挂了
前端·人工智能·后端
ServBay4 小时前
本地模型已经跑起来了,Copilot Fusion 为什么还要联网?
后端·ai编程·github copilot
武子康4 小时前
H3-World 的动作没按时发生,先检查时间线变成了什么
人工智能·后端·agent
苍何4 小时前
腾讯 Buddy One 来了,办公全家桶一键打通WorkBuddy(附教程)
后端
GIS数据转换器5 小时前
基于CIM的城市智慧供热监管服务平台
java·大数据·开发语言·人工智能·后端·物联网·struts
adfreedom5 小时前
如何避免每个业务系统中都有几十个枚举查询
后端