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

Krz*_*rko 3 c# asp.net-authorization asp.net-core asp.net-core-3.1

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

会话在控制器操作中正常工作,但是当我尝试使用IHttpContextAccessor.HttpContext.Sessiona访问它时MyAuthorizationHandler.HandleRequirementAsync,我收到InvalidOperationException“尚未为此应用程序或请求配置会话。”。在IHttpContextAccessor访问查询,饼干等-但无法访问会话数据。

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

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();
}
Run Code Online (Sandbox Code Playgroud)

注意:我不能在这个处理程序中使用声明,我需要会话数据。

Xue*_*hen 5

的顺序 app.UseSession();不正确,你应该把它放在任何使用会话的中间件之前。

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

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

   app.UseEndpoints...
   app.UseMvc();
}
Run Code Online (Sandbox Code Playgroud)