Как получить доступ к данным сеанса в IAuthorizationHandler в ASP. NET Core 3.1? - PullRequest
1 голос
/ 05 марта 2020

У меня проблемы с доступом к данным сеанса в пользовательском обработчике авторизации, хотя он работает в другом месте.

Сеанс правильно работает в действиях контроллера, но когда я пытаюсь получить к нему доступ с помощью IHttpContextAccessor.HttpContext.Session в MyAuthorizationHandler.HandleRequirementAsync, Я получаю InvalidOperationException «Сеанс не настроен для этого приложения или запроса.». IHttpContextAccessor имеет доступ к запросу, куки и т. Д. c - но не может получить доступ к данным сеанса.

Если я пытаюсь получить доступ к тем же 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();
}

Примечание: я не могу использовать утверждения в этом обработчике, мне нужны данные сеанса.

1 Ответ

2 голосов
/ 06 марта 2020

Порядок app.UseSession(); неверен, вы должны поставить его перед любым промежуточным программным обеспечением, использующим сеанс.

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

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

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