You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 6 Web API角色授权时会话未配置异常求助

解决Session未配置的异常问题

1. 注册Session服务

在Program.cs中先配置Session服务,必须放在授权相关服务之前:

builder.Services.AddSession(options =>
{
    // 可按需设置Session过期时间,示例设为30分钟
    options.IdleTimeout = TimeSpan.FromMinutes(30);
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
});

// 接着注册授权策略与自定义处理器
builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("SessionBasedPolicy", policy =>
        policy.Requirements.Add(new SessionBasedAuthorizationRequirement(/* 传入你的角色枚举值 */)));
});
builder.Services.AddScoped<IAuthorizationHandler, SessionBasedAuthorizationHandler>();
// 务必注册IHttpContextAccessor
builder.Services.AddHttpContextAccessor();

2. 调整中间件顺序

管道配置中UseSession必须在UseAuthorization之前执行,否则授权处理器无法访问Session:

app.UseHttpsRedirection();
app.UseStaticFiles();

// 先启用Session中间件
app.UseSession();

app.UseRouting();

// 再启用授权中间件
app.UseAuthorization();

app.MapControllers();
app.MapFallbackToFile("index.html"); // React应用的路由 fallback

3. 跨域场景允许凭证传递

如果React前端与API后端跨域部署,需要配置CORS允许携带Cookie/Session:

builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowReactApp", policy =>
    {
        policy.WithOrigins("http://localhost:3000") // 替换为你的React应用实际地址
              .AllowAnyHeader()
              .AllowAnyMethod()
              .AllowCredentials();
    });
});

// 管道中需在UseRouting前启用CORS
app.UseCors("AllowReactApp");

4. 优化授权处理器的HttpContext获取方式

可以直接从AuthorizationHandlerContext的Resource属性获取HttpContext,无需依赖IHttpContextAccessor:

protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, SessionBasedAuthorizationRequirement requirement)
{
    var httpContext = context.Resource as HttpContext;
    if (httpContext == null)
    {
        context.Fail();
        return Task.CompletedTask;
    }

    string role = httpContext.Session.GetString("Role");
    if (role == null)
    {
        context.Fail();
        return Task.CompletedTask;
    }

    if (role == requirement.Role.ToString())
    {
        context.Succeed(requirement);
    }
    else
    {
        context.Fail();
    }

    return Task.CompletedTask;
}

内容的提问来源于stack exchange,提问作者Dakata RM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:45:47