При попытке сохранить данные пользователя в dbcontext после первой регистрации с Auth0 в asp. net core - PullRequest
1 голос
/ 26 апреля 2020

Чего я пытаюсь достичь: 1. Получение всех претензий после события OnTicketReceived от Auth0. 2. Проверка, регистрируется ли пользователь впервые (значение bool в 1 из претензий). 3. Сохранение нового пользовательского объекта в localdb (при первом входе в систему). В настоящее время я застрял на третьем этапе. Чтобы использовать OnTicketReceived, мне нужен метод stati c справа, но затем я не могу использовать DbContext в своем классе контроллера, поскольку он не является переменной stati c.

Startup.cs

services.AddAuthentication(options =>
            ...
            .AddOpenIdConnect("Auth0", options =>
            {
                options.Scope.Add("openid");
                ...
                options.Events = new OpenIdConnectEvents
                {
                    OnTicketReceived = UsersController.CreateOnSignUp,
                ...
                };
            });

UsersController.cs

        public static async Task<Task> CreateOnSignUp(TicketReceivedContext ticketReceivedContext)
        {
            List<Claim> claims = ticketReceivedContext.Principal.Claims.ToList();
            var claim = claims.FirstOrDefault(x => x.Type.EndsWith("isNewUser"));
            bool isNewUser = bool.Parse(claim.Value);

            if (isNewUser)
            {
                string userOId = claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Value;
                User user = new User() { ExternalId = userOId };
                //insert new value into DB
                //_context.Add(user);
                //await _context.SaveChangesAsync();
            }

            return Task.CompletedTask;
        }

Комментированные строки кода в настоящее время не работают. Кто-нибудь может порекомендовать лучший способ сохранения пользовательских данных в БД после аутентификации или обходного пути для моего текущего решения?

1 Ответ

0 голосов
/ 26 апреля 2020

Прежде всего, контроллеры создаются для каждого вызова (или для каждого HTTP-запроса). Вы не должны поддерживать какое-либо состояние, вводя stati c свойства, поля или методы внутри контроллеров.

В вашем случае я бы создал класс обслуживания ServiceSignUp, который состоит из метода CreateOnSignUp.

 public interface IServiceSignUp
 {
    async Task CreateOnSignUp(TicketReceivedContext ticketReceivedContext);
 }

 public class ServiceSignUp : IServiceSignUp
 {
    public async Task CreateOnSignUp(TicketReceivedContext ticketReceivedContext)
    {
       ....
    } 
 }

Затем зарегистрируйте их во встроенном контейнере Io C, например services.AddSingleton<IServiceSignUp, ServiceSignUp>();

В методе ConfigureServices() внутри класса StartUp:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IServiceSignUp, ServiceSignUp>();

    services.AddAuthentication(options =>
                ...

            .AddOpenIdConnect("Auth0", options =>
            {
                options.Scope.Add("openid");
                ...
                options.Events = new OpenIdConnectEvents
                {
                    OnTicketReceived += ServiceSignUp.CreateOnSignUp,
                    ...
                };
            });
}
...