Я следовал официальным документам для доступа к 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?}");
});
}