Претензии в IHttpContextAccessor пусты - PullRequest
0 голосов
/ 27 февраля 2020

в моем. net core mvc приложении Я пытаюсь получить заявки пользователей в моем сервисе пользователя. но список претензий пуст.

public class CurrentUserService : ICurrentUserService
{
    public CurrentUserService(IHttpContextAccessor httpContextAccessor)
    {
        UserId = httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier);
    }
    public string UserId { get; }
}

Service

но на странице есть претензии. В чем разница?

Page

ConfigureServices:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultUI();

        services.AddHttpContextAccessor();
        services.AddScoped<ICurrentUserService, CurrentUserService>();
        services.AddTransient<IEmailSender, EmailSender>();
        services.Configure<EmailOptions>(options =>
        {
            Configuration.GetSection("Email").Bind(options);
        });
        services.AddPingIdentity(Configuration);
        services.AddApplication();
        services.AddInfrastructure(Configuration);

        services.AddConfiguredRazorPages();
    }

enter image description here

1 Ответ

1 голос
/ 28 февраля 2020

Проблема заключается в том, что CurrentUserService создается инфраструктурой внедрения зависимостей до того, как промежуточное ПО аутентификации установит требования HttpContext.User. Поскольку к HttpContext.User обращаются (используя IhttpContextAccessor) в конструкторе CurrentUserService, утверждения еще не доступны.

Потенциальным решением является доступ к свойству HttpContext.User при доступе к UserId свойство ICurrentUserService.

public class CurrentUserService : ICurrentUserService
{
    private readonly IHttpContextAccessor httpContextAccessor;
    public CurrentUserService(IHttpContextAccessor httpContextAccessor)
    {
        this.httpContextAccessor = httpContextAccessor;
    }
    public string UserId => httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier);
}
...