Доступ к зарегистрированному пользователю в dotnet 3.1 с помощью HttpContextAccessor

Хорошо, так что я становлюсь нетерпеливым здесь. :) Я пытаюсь получить доступ к моему авторизованному пользователю через HttpContext.User, обратившись к IHttpContextAccessor, но ни пользователь, ни какие-либо претензии. Здесь используется ядро ​​Dotnet 3.1. В основном, как я это понимаю: войдите в систему с помощью HttpContext.SignInAsync(... а затем контекст доступен через внешние контроллеры IHttpContextAccessor. Теперь контекст доступен, но не могу найти доступную информацию о пользователе из входа. Я делаю видеть, что файлы cookie правильно прикреплены к запросам, но некоторые преобразования не выполняются Кто-нибудь знает, что мне не хватает?

            //My controller action:

            var claimsIdentity = new ClaimsIdentity("Application");
            claimsIdentity.AddClaim(emailClaim);
            ... more claims

            await HttpContext.SignInAsync(
                "Application",
                new ClaimsPrincipal(claimsIdentity)
            );


            // Startup.cs:ConfigureServices
            
             services.AddHttpContextAccessor();


            // In a MyClass

            MyClass(IHttpContextAccessor accessor)
            {
                accessor.HttpContext.Claims; // Nothing
            }

Любое обновление? Вам поможет мой ответ?

Brando Zhang 16.12.2020 07:16

Да частично! Я внедрил MyClass как синглтон, но самая большая проблема была с моей конфигурацией. Спасибо, что нашли время!

Nikola Sevo 17.12.2020 09:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
1 146
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Насколько мне известно, если мы использовали аутентификацию с помощью файлов cookie и пользователь уже вошел в систему, мы могли бы получить утверждения от средства доступа httpcontext.

Я предлагаю вам сначала убедиться, что браузер установил токен аутентификации через файл cookie на сервер.

Затем я предлагаю вам убедиться, что вы внедрили myclass как ограниченный, а не Singleton.

Подробнее см. ниже тестовые коды для чтения файла cookie.

Мои занятия:

public class Myclass
{
    public IHttpContextAccessor _accessor { get; set; }
     public Myclass(IHttpContextAccessor accessor)
    {
        _accessor = accessor;

      var re =  accessor.HttpContext.User.Identity as ClaimsIdentity;
        int i = 0;
    }

    public string GetName() {
        var re = _accessor.HttpContext.User.Identity as ClaimsIdentity;

        string name = re.Claims.First(x => x.Type == "name").Value;

        return name;
    }


}

Запуск.cs:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie();
        services.AddHttpContextAccessor();
        services.AddScoped(typeof(Myclass));
    }

Использование:

public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;
    public Myclass test { get; set; }

    public HomeController(ILogger<HomeController> logger, Myclass _test)
    {
        _logger = logger;
        test = _test;
    }

    public async Task<IActionResult> IndexAsync()
    {
        var claimsIdentity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
        claimsIdentity.AddClaim(new Claim("name", "aaaa"));
        await HttpContext.SignInAsync(
           CookieAuthenticationDefaults.AuthenticationScheme,
            new ClaimsPrincipal(claimsIdentity)
        );
        return View();
    }

    public async Task<IActionResult> PrivacyAsync()
    {
        var  re= test.GetName();

        return View();
    }

    [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
    public IActionResult Error()
    {
        return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
    }
}

Результат:

Спасибо за помощь! Я сделал DInject My Class как singleton, так что это могло быть одной из проблем, но основная проблема заключалась в моей конфигурации.

Nikola Sevo 17.12.2020 08:53
Ответ принят как подходящий

Итак, похоже, я неправильно настроил аутентификацию с помощью файлов cookie в Google. Возможно, возникла проблема с внедрением MyClass.cs как синглтона, так что на это следует обратить внимание.

Настройка на основе: как реализовать вход через google в ядро ​​.net без провайдера entityframework и https://dotnetthoughts.net/aspnetcore-social-authentication-without-identity/

Это моя рабочая конфигурация:

            // Startup.cs:ConfigureServices
            services.AddAuthentication(v => {
                v.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                v.DefaultChallengeScheme = GoogleDefaults.AuthenticationScheme;
            })
            .AddCookie()
            .AddGoogle(GoogleDefaults.AuthenticationScheme, options =>
            {
                IConfigurationSection googleAuthNSection =
                    Configuration.GetSection("Authentication:Google");

                options.ClientId = googleAuthNSection["ClientId"];
                options.ClientSecret = googleAuthNSection["ClientSecret"];
            });
             
            // DIs accessor
            services.AddHttpContextAccessor();


            // AuthenticationController.cs:MyAction

            var authenticateResult = await HttpContext.AuthenticateAsync(GoogleDefaults.AuthenticationScheme);

            var claimsIdentity = new ClaimsIdentity("Application");

            var surnameClaim = authenticateResult.Principal.FindFirst(ClaimTypes.Surname);

            claimsIdentity.AddClaim(surnameClaim);

            await HttpContext.SignInAsync(
               "Application",
                new ClaimsPrincipal(claimsIdentity)
            );

        return LocalRedirect(returnUrl ?? "~/");



        // In MyClass.cs

        MyClass(IHttpContextAccessor accessor)
        {
            accessor.HttpContext.Claims; // Claims available!
        }

Другие вопросы по теме