如何在 ASP.NET Core 3.1 的 IAuthorizationHandler 中访问会话数据?

How to access session data in IAuthorizationHandler in ASP.NET Core 3.1?

我在自定义授权处理程序中访问会话数据时遇到困难,而它在其他地方工作。

会话在控制器操作中正常工作,但是当我尝试在 MyAuthorizationHandler.HandleRequirementAsync 中使用 IHttpContextAccessor.HttpContext.Session 访问它时,我得到一个 InvalidOperationException "Session has not been configured for this application or request."。 IHttpContextAccessor 可以访问查询、cookie 等 - 但无法访问会话数据。

如果我尝试从控制器访问相同的 MyAuthorizationHandlerIHttpContextAccessor,会话数据可用。

MyAuthorizationHandlerConfigureServices 中作为单例注入,完整的初始化顺序:

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();的顺序不正确,应该放在任何使用session的中间件之前。

public void Configure(...)
{
   app.UseSession();

   app.UseRouting();
   app.UseAuthentication();
   app.UseAuthorization();

   app.UseEndpoints...
   app.UseMvc();
}