.Net 实操将Token存入Session

一、参考

.NET Session - 掘金 (juejin.cn)

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

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

二、环境搭建

2.1 依赖下载

Microsoft.AspNetCore.Session

2.2 服务注册

主要注册了过滤器ActionApiFilterJWT请求头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不同

相关推荐
星栈9 分钟前
ADK-Rust 是什么?Rust 生态新一代 AI Agent 开发套件
后端·agent
盖伦发发17 分钟前
业务开发常用设计模式:状态、策略、工厂、适配器、模板方法
后端·软件工程
程序员老赵1 小时前
Docker 部署 XXL-JOB:轻松搭建分布式任务调度平台
后端·docker·开源
用户233376852181 小时前
Docker镜像找不到排障实录-CRLF跨平台暗雷
后端
程序员cxuan1 小时前
从 0 到 1 速通 WorkBuddy
人工智能·后端·程序员
薛定谔的算法1 小时前
M01:环境搭建与第一个 Java 程序
后端
盗_心i1 小时前
OCPP 1.6-J 配置管理手册:GetConfiguration / ChangeConfiguration 与标准配置键
后端
传奇开心果编程2 小时前
【Go入门练中学】第1课:从零开始
后端·学习·golang
isfox2 小时前
Python 的 @classmethod 和 @staticmethod:什么时候用哪个,一次说清楚
后端
薛定谔的算法2 小时前
前端视角秒懂:Java 和 Spring Boot 的关系,就像 JS 和 React
后端