Исключение недопустимой операции сеанса IHttpContextAccessor в CustomClaimsTransformer - PullRequest
0 голосов
/ 30 августа 2018

Я следовал официальным документам для доступа к HttpContext из пользовательских компонентов в CustomClaimsTransformer. В прошлом у меня было основное веб-приложение .net, где я использовал сеанс, чтобы администраторы могли перейти в приложение с видом (идентификатором) другого пользователя (в целях поддержки). Я храню информацию, для которой пользователь должен подготовить представление в сеансе. Теперь я хотел сделать его более элегантным и использовать авторизацию ядра .net с использованием утверждений и авторизации на основе ролей. Поскольку за этим стоит аутентификация Windows, я должен использовать CustomClaimsTransformer. Теперь моя проблема в том, что я хочу получить доступ к текущему сеансу из CustomClaimsTransformer. Я могу ввести IHttpContextAccessor, но IHttpContextAccessor.Session всегда вызывает недопустимое исключение операции.

Startup.cs:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,
        options =>
        {
            options.LoginPath = new PathString("/Account/Login/");
            options.AccessDeniedPath = new PathString("/Account/Forbidden/");
        });
        services.Configure<CookiePolicyOptions>(options =>
        {
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });
        services.AddAuthorization(options =>
        {
            options.AddPolicy("RequireAdministratorRole", policy => policy.RequireClaim(ClaimTypes.Role, "admin"));
            options.AddPolicy("Test1", policy => policy.RequireClaim("Rechte", " Test1"));
            options.AddPolicy("Test2", policy => policy.RequireClaim("Rechte", " Test2"));

        });

        services.AddMvc(config =>
             {
                 var policy = new AuthorizationPolicyBuilder()
                    .RequireAuthenticatedUser()
                    .Build();
                 config.Filters.Add(new AuthorizeFilter(policy));
             }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        //services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        services.AddHttpContextAccessor();
        services.AddTransient<IClaimsTransformation, CustomClaimsTransformer>();
        services.AddDistributedMemoryCache();
        services.AddSession();
    }

CustomClaimsTransformer:

CustomClaimsTransformer:
public class CustomClaimsTransformer : IClaimsTransformation
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    public CustomClaimsTransformer(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }


    public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        var z = _httpContextAccessor.HttpContext; //works
        var zz = _httpContextAccessor.HttpContext.Session; // System.InvalidOperationException: "Session has not been configured for this application or request."

Любая помощь приветствуется

Редактировать 1:

Я отредактировал мои ConfigureServices выше, при вставке кода я удалил несколько строк для удобства чтения, в том числе строку AddDistributedMemoryCache, извините. Сессия работает в приложении, за исключением случаев, когда показано.

Настройка:

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();
        app.UseSession();

        app.UseAuthentication();

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

1 Ответ

0 голосов
/ 30 августа 2018

Ссылка Сеанс и состояние приложения в ASP.NET Core

Чтобы включить промежуточное программное обеспечение сеанса, Startup должно содержать:

  • Любой из IDistributedCache кэшей памяти. Реализация IDistributedCache используется в качестве резервного хранилища для сессия.
  • Звонок на AddSession в ConfigureServices.
  • Звонок на UseSession в Configure.

Также

public void Configure(IApplicationBuilder app, IHostingEnvironment env) {

    //... removed for brevity

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();
    app.UseSession(); // This must come before "UseMvc()"
    app.UseHttpContextItemsMiddleware();
    app.UseMvc();
}

Порядок промежуточного программного обеспечения важен. В предыдущем примере InvalidOperationException исключение возникает, когда UseSession вызывается после UseMvc.
...
HttpContext.Session невозможно получить до вызова UseSession.

...