用户首次使用 OpenId Connect 登录后,将新 UserId 放入数据库的位置在哪里?

本地IdentityServer4通过OpenIdConnect第一次访问站点时需要注册一个新用户。找到了在OnUserInformationReceived事件中执行此操作的“最佳位置” ,但不确定如何在事件处理程序(启动类)中访问 EF DbContext。没有用于获取 DbContext 的预配置实例(在其构造函数中请求其他依赖项)的 DI。


public void ConfigureServices(IServiceCollection services)

{

    // ...


    services.AddAuthentication(options =>

        {

            options.DefaultScheme = "Cookies";

            options.DefaultChallengeScheme = "oidc";

        })

        .AddCookie("Cookies")

        .AddOpenIdConnect("oidc", options =>

        {

            options.SignInScheme = "Cookies";


            // ...


            options.Events.OnUserInformationReceived = OnUserInformationReceived;

        });


    // ...

}


private Task OnUserInformationReceived(UserInformationReceivedContext c)

{

    var userId = c.User.Value<string>(JwtRegisteredClaimNames.Sub);


    // Call DbContext to insert User entry if doesn't exist.

    // Or there is another place to do that?


    return Task.CompletedTask;

}


慕田峪7331174
浏览 209回答 1
1回答

动漫人物

本UserInformationReceivedContext类包括一个HttpContext属性,它本身包括一个RequestServices属性。此RequestServices属性的类型为IServiceProvider,可用于访问在依赖注入容器中注册的服务。这是一个使用示例GetService<T>:private Task OnUserInformationReceived(UserInformationReceivedContext c){&nbsp; &nbsp; var userId = c.User.Value<string>("sub");&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; var dbContext = c.HttpContext.RequestServices.GetService<YourDbContext>();&nbsp; &nbsp; // Use dbContext here.&nbsp; &nbsp; return Task.CompletedTask;}
打开App,查看更多内容
随时随地看视频慕课网APP