Как получить доступ к сессии в OpenIdConnect TokenValidated даже обработчик - PullRequest
0 голосов
/ 29 июня 2018

У меня есть приложение ASP.NET Core 2.1 MVC, в котором я настроил провайдера OpenIdConnect для аутентификации. Класс Startup выглядит следующим образом:

public void ConfigureServices(IServiceCollection services)
    {

        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => false;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
        services.AddDistributedMemoryCache();
        services.AddSession(options =>
        {
            // Set a short timeout for easy testing.
            options.IdleTimeout = TimeSpan.FromSeconds(1200);
            options.Cookie.HttpOnly = true;
        });

        services.AddHttpContextAccessor();
        services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();
        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        services.AddTransient<IClientDataHandler, ClientDataHandler>();

        services.AddAuthentication(options => .AddOpenIdConnect("oidc", options =>
            {
                ...


                options.Events.OnTokenValidated = async x =>
                {
                    var serviceScopeFactory = services.BuildServiceProvider().GetRequiredService<IServiceScopeFactory>();
                    ...

                    await x.HttpContext.Session.LoadAsync(new CancellationToken()); --does NOT work
                    x.HttpContext.Session.Set("clients", Utils.ObjectToByteArray(someData)); --does NOT work

                };}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseAuthentication();
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseSession();
        app.UseCookiePolicy();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }

Хотя это позволяет мне использовать HttpContext.Session (путем внедрения IHttpContextAccessor) в любом контроллере или службе, я не могу использовать Session в обработчике событий TokenValidated. Любая помощь?

Заранее спасибо.

1 Ответ

0 голосов
/ 29 июня 2018

Вы не должны создавать поставщика услуг в своем обработчике событий. Это не выполняется во время запуска. Он выполняется при каждом запросе вашим обработчиком аутентификации спустя долгое время после создания поставщика услуг.

options.Events.OnTokenValidated = async context =>
{
    // don't do this...service provider is already built
    var serviceScopeFactory = services.BuildServiceProvider().GetRequiredService<IServiceScopeFactory>();
};

Вместо этого вы можете получить доступ к встроенному поставщику услуг из HttpContext.RequestServices.

options.Events.OnTokenValidated = async context =>
{
    var serviceScopeFactory = context.HttpContext.RequestServices.GetRequiredService<IServiceScopeFactory>();
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...