c# - 如何在 ASP.NET Core 3.1 的 IAuthorizationHandler 中访问会话数据?
问题描述
我在自定义授权处理程序中访问会话数据时遇到困难,而它在其他地方工作。
会话在控制器操作中正常工作,但是当我尝试使用 in 访问它时IHttpContextAccessor.HttpContext.Session
,MyAuthorizationHandler.HandleRequirementAsync
我得到InvalidOperationException
“尚未为此应用程序或请求配置会话。”。IHttpContextAccessor
可以访问查询、cookie 等 - 但无法访问会话数据。
如果我尝试从控制器访问相同MyAuthorizationHandler
的 ' IHttpContextAccessor
,则会话数据可用。
MyAuthorizationHandler
作为一个单例注入ConfigureServices
,初始化的完整顺序:
public void ConfigureServices(IServiceCollection services)
{
services.AddDistributedMemoryCache();
services.AddSession();
services.AddDefaultIdentity...
services.AddControllersWithViews();
services.AddRazorPages();
services.AddControllers...
services.AddAuthentication...
services.AddAuthorization...
services.AddHttpContextAccessor();
services.AddSingleton<IAuthorizationHandler, MyAuthorizationHandler>();
services.Configure<CookiePolicyOptions>...
services.AddMvc(o => o.EnableEndpointRouting = false);
}
public void Configure(...)
{
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseSession();
app.UseEndpoints...
app.UseMvc();
}
注意:我不能在这个处理程序中使用声明,我需要会话数据。
解决方案
的顺序 app.UseSession();
不正确,你应该把它放在任何使用会话的中间件之前。
public void Configure(...)
{
app.UseSession();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints...
app.UseMvc();
}
推荐阅读
- html - 为什么我的盒子 div 位于应该在它上面的两个元素后面?
- python - 我想知道我对使用 keras 实现 lstm 层是否正确
- mongodb - MongoDB 找不到包含相同日期的两个不同字段的文档
- node.js - 如何使用 mongoose 控制器路由将两个 mongodb 集合连接在一起?
- android - 如何防止特定风味的单元测试以另一种风味编译?
- sql - 如何优化 Postgres 中存储过程的性能?
- ruby-on-rails - 我可以使用类似于 String#constantize 的东西来初始化 Hyperstack::Component 吗?
- javascript - 使用单个循环仅添加数组的不同元素
- android - 如何从 URL 链接下载音频文件?
- swift - 如何使表格视图单元格中的按钮工作