我试图了解如何将存储在现有数据库(位于:localhost:3306(中的用户(电子邮件、密码、名字、姓氏和操作系统(绑定到我的 IdentityServer4 项目中,以便我可以使用这些信息登录用户或将新用户注册到该数据库中?
我阅读了一些教程(特别是 http://docs.identityserver.io/en/release/quickstarts/8_entity_framework.html(,但我认为这始终适用于同一项目中的数据库。 我的数据库不在同一个项目中。
在这种情况下,我读到了 asp.net 核心身份。 但我不完全明白这有什么关系。
有人可以告诉我如何在项目中绑定数据库以及身份与应用程序用户等的作用是什么?
提前致谢
本文与您的情况更相关。您链接的那个用于配置数据,而不是用户数据:http://docs.identityserver.io/en/release/quickstarts/6_aspnet_identity.html
简而言之,您希望通过 Asp.Net 核心身份访问您的用户数据。您需要:
- 创建一个包含相关字段的用户类作为数据库
- 创建一个 EntityFramework DbContext 类以将数据库映射到您的类
- 使用 ASPNET 核心标识注册用户类和数据库上下文
- 告诉 IdentityServer 使用 AspNetIdentity
这就是启动配置服务方法在实现后的样子。这里没有图片的是您需要创建的 DbContext 和 User 类。
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>();
}
有关配置用户类和数据库上下文的详细信息,请参阅 AspNet Identity 上的文档: https://learn.microsoft.com/en-us/aspnet/core/security/authentication/identity
你需要实现自己的UserStore
(示例(
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);
}