2017-05-15 38 views
3

我尝试了解如何将存储在现有数据库(位于本地主机:3306)中的用户(电子邮件,密码,名字,姓氏和操作系统)绑定到我的identityserver4项目,以便我可以使用这些信息登录用户或注册一个新的用户到该数据库?如何从身份服务器4的现有数据库获取用户

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

在这种情况下,我读了关于asp.net核心身份。但我不完全理解这是如何相关的。

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

在此先感谢

+0

实现某种用户存储,例如Teat one,但将其指向外部数据库。 github.com/IdentityServer/IdentityServer4.Samples/blob/release/Quickstarts/8_EntityFrameworkStorage/src/QuickstartIdentityServer/Quickstart/Account/AccountController.cs – Mardoxx

回答

1

本文与您的情况更相关。您链接的是配置数据,而不是用户数据: http://docs.identityserver.io/en/release/quickstarts/6_aspnet_identity.html

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

  • 使含有相关领域的数据库
  • 用户类创建的EntityFramework的DbContext类数据库映射到类
  • 注册用户类的DbContext与ASPNET核心身份
  • 告诉IdentityServer使用AspNetIdentity

这是您的启动ConfigureServices方法可能是什么样子一旦落实。这里没有描绘出你需要创建的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身份的文档的详细信息,配置用户类的DbContext:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity

+0

嗨,你给黑暗带来了许多光明。我有一个关于用户类的问题。没有身份我有一个类的用户(如表名),并在这个类中我定义了用户的所有细节(如电子邮件,街道,性别......)如果我使用身份我有一个ApplicationUser类继承IdentityUser。这就像没有身份的用户一样吗?在这里,我必须添加不属于IdentityUser的特殊信息(如性别)?我希望你能理解我的意思。 – eldios1981

1

你需要实现自己的UserStoreexample

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); 
    } 
相关问题