2017-05-15 4 views
3

Ich versuche zu verstehen, wie ich Benutzer (E-Mail, Passwort, Vorname, Nachname und OS on), die in einer vorhandenen Datenbank gespeichert sind (befindet sich: localhost: 3306) in meine identityserver4-Projekt, damit ich diese Informationen verwenden kann, um einen Benutzer anzumelden oder einen neuen Benutzer in dieser Datenbank zu registrieren?Wie Benutzer aus einer bestehenden Datenbank für identityServer4

Ich lese einige Tutorials (speziell http://docs.identityserver.io/en/release/quickstarts/8_entity_framework.html), aber ich denke, das ist immer für db im selben Projekt. Meine db ist nicht im selben Projekt.

In diesem Zusammenhang las ich über asp.net-core Identity. aber ich verstehe nicht vollständig, wie das zusammenhängt.

Kann mir jemand sagen, wie kann ich eine db in meinem Projekt binden und was ist die Rolle der Identität mit der Anwendung Benutzer und so weiter?

danke im voraus

+0

Implementieren Sie eine Art Benutzerspeicher, wie den Teat one, aber zeigen Sie ihn auf Ihre externe DB. github.com/IdentityServer/IdentityServer4.Samples/blob/release/Quickstarts/8_EntityFrameworkStorage/src/QuickstartIdentityServer/Quickstart/Account/AccountController.cs – Mardoxx

Antwort

1

Dieser Artikel ist relevanter für Ihre Situation. Dasjenige, das Sie verbunden haben, ist für Konfigurationsdaten und nicht für Benutzerdaten: http://docs.identityserver.io/en/release/quickstarts/6_aspnet_identity.html

Kurz gesagt, Sie möchten auf Ihre Benutzerdaten über Asp.Net Core Identity zugreifen. Sie müssen:

  • eine Benutzerklasse Machen Sie die entsprechenden Felder wie Ihre Datenbank mit
  • eine EntityFramework DbContext Klasse Erstellen Sie Ihre Datenbank zu Ihrer Klasse
  • Registrieren Benutzerklasse und DbContext mit aspnet Kernidentität zur Karte
  • IdentityServer Sagen AspNetIdentity zu verwenden

Dies ist, was Ihr Startup ConfigureServices Methode wie einmal implementiert aussehen könnte. Nicht abgebildet sind die DbContext- und User-Klassen, die Sie erstellen müssen.

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>(); 
} 

auf die docs auf ASPnet Identität Siehe Details zu Ihrer Benutzerklasse Konfiguration und DbContext: https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity

+0

Hallo, du bringst viel Licht in die Dunkelheit. Ich habe eine Frage zur Benutzerklasse. Ohne Identität habe ich eine Klasse Benutzer (wie der Name der Tabelle) und in dieser Klasse habe ich alle Details für Benutzer (wie E-Mail, Straße, Geschlecht ..) definiert. Wenn ich Identität verwenden, habe ich eine ApplicationUser-Klasse, die von IdentityUser erbt. Ist das die gleiche Klasse wie Benutzer ohne Identität? Hier muss ich spezielle Informationen (wie Gender) hinzufügen, die nicht Teil des IdentityUser sind? Ich hoffe du verstehst was ich meine. – eldios1981

1

Sie benötigen eine eigenes 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; 
     }   
} 

zu implementieren und diese verwenden in Ihr 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); 
    } 
Verwandte Themen