繁体   English   中英

尝试在 asp.net 核心中首次使用 Auth0 注册后将用户数据保存到 dbcontext

[英]Trying so save user data to dbcontext after first signup with Auth0 in asp.net core

我想要实现的目标: 1. 从 Auth0 获取 OnTicketReceived 事件之后的所有声明。 2. 检查用户是否是第一次注册(声明中的布尔值)。 3. 将新用户 object 保存到 localdb(如果是第一次登录)。 目前我被困在第三步。 In order to use OnTicketReceived I need a static method on the right side but then I cannot use DbContext in my controller class because it is not a static variable.

启动.cs

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

用户控制器.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;
        }

注释的代码行当前不起作用。 任何人都可以推荐一种在身份验证后将用户数据保存到数据库的更好方法或我当前解决方案的解决方法吗?

首先,每个调用(或每个 HTTP 请求)都会实例化控制器。 您不应通过在控制器中引入 static 属性、字段或方法来维护任何 state。

在您的情况下,我将创建一个包含CreateOnSignUp方法的服务 class ServiceSignUp

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

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

然后将它们注册到内置的 IoC 容器中,例如services.AddSingleton<IServiceSignUp, ServiceSignUp>();

StartUp class 内的ConfigureServices()方法中:

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,
                    ...
                };
            });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM