如何从 identityServer4 的现有数据库中获取用户

How to get users from a existing database for identityServer4

我试图了解如何将存储在现有数据库(位于:localhost:3306)中的用户(电子邮件、密码、名字、姓氏和 os 绑定到我的 identityserver4 项目中这样我就可以使用这些信息登录用户或将新用户注册到该数据库中?

我阅读了一些教程(特别是 http://docs.identityserver.io/en/release/quickstarts/8_entity_framework.html),但我认为这始终适用于同一项目中的数据库。我的数据库不在同一个项目中。

在这种情况下,我读到了 asp.net-core Identity。但我不完全理解那是如何相关的。

有人可以告诉我如何在我的项目中绑定数据库以及身份与应用程序用户等的作用是什么?

提前致谢

这篇文章更符合您的情况。您链接的是配置数据而不是用户数据: http://docs.identityserver.io/en/release/quickstarts/6_aspnet_identity.html

简而言之,您想通过 Asp.Net Core Identity 访问您的用户数据。 您需要:

  • 创建一个包含相关字段的用户 class 作为您的数据库
  • 创建一个 EntityFramework DbContext class 以将您的数据库映射到您的 class
  • 使用 aspnet 核心身份注册您的用户 class 和 dbcontext
  • 告诉 IdentityServer 使用 AspNetIdentity

这就是您的 Startup ConfigureServices 方法实施后的样子。此处未显示的是您需要创建的 DbContext 和 User classes。

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddEntityFramework()
        .AddSqlServer()
        .AddDbContext<YourUserStoreDbContextHere>(options =>
            options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

    services.AddIdentity<YourUserClassHere, YourRoleClassHereIfAny>()
        .AddEntityFrameworkStores<YourUserStoreDbContextHere>()
        .AddDefaultTokenProviders();

    services.AddIdentityServer()
        // Other config here
        .AddAspNetIdentity<YourUserClassHere>();
}

有关配置用户 class 和 dbcontext 的详细信息,请参阅 AspNet Identity 上的文档:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity

您需要实现自己的 UserStore (example)

public async Task<TapkeyUser> ValidateCredentialsAsync(string username, string password)
{
      //This is pseudo-code implement your DB logic here
      if (database.query("select id from users where username = username and password = password") 
      {
           return new User(); //return User from Database here 
      } else {
           return null;
      }        
}

并在您的 AccountController 中使用它:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Login(LoginInputModel model)
    {
        if (ModelState.IsValid)
        {
            // use our custom UserStore here
 -------->  if (_users.ValidateCredentials(model.Username, model.Password))
            {
                AuthenticationProperties props = null;
                // only set explicit expiration here if persistent. 
                // otherwise we reply upon expiration configured in cookie middleware.
                if (AccountOptions.AllowRememberLogin && model.RememberLogin)
                {
                    props = new AuthenticationProperties
                    {
                        IsPersistent = true,
                        ExpiresUtc = DateTimeOffset.UtcNow.Add(AccountOptions.RememberMeLoginDuration)
                    };
                };

                // issue authentication cookie with subject ID and username
                var user = _users.FindByUsername(model.Username);
                await _events.RaiseAsync(new UserLoginSuccessEvent(user.Username, user.SubjectId, user.Username));
                await HttpContext.Authentication.SignInAsync(user.SubjectId, user.Username, props);

                // make sure the returnUrl is still valid, and if yes - redirect back to authorize endpoint or a local page
                if (_interaction.IsValidReturnUrl(model.ReturnUrl) || Url.IsLocalUrl(model.ReturnUrl))
                {
                    return Redirect(model.ReturnUrl);
                }

                return Redirect("~/");
            }

            await _events.RaiseAsync(new UserLoginFailureEvent(model.Username, "invalid credentials"));

            ModelState.AddModelError("", AccountOptions.InvalidCredentialsErrorMessage);
        }

        // something went wrong, show form with error
        var vm = await _account.BuildLoginViewModelAsync(model);
        return View(vm);
    }