2016-08-02 12 views
9

Ich habe kürzlich an einer .NET Core Web API gearbeitet. Ich habe gerade die Authentifizierung mit JWT versucht, indem ich die Anleitung unter https://stormpath.com/blog/token-authentication-asp-net-core befolge.Kann ich beim Start in ASP.NET Core auf eine Datenbank zugreifen?

Alles lief gut, bis ich den hartcodierten Benutzernamen und Passwörter in der GetIdentity Methode durch eine DB-Abfrage ersetzen musste und erkannte, dass ich nicht weiß, wie man von dieser Datei auf die DB zugreift!

Die Methode, die ich beziehe mich auf unterhalb der Linie in der Verbindung gezeigt 70. https://github.com/nbarbettini/SimpleTokenProvider/blob/master/test/SimpleTokenProvider.Test/Startup.Auth.cs

Meine Fragen sind wie folgt.

  1. Kann ich hier auf die Datenbank zugreifen? Wenn das so ist, wie?
  2. Sollte dies die GetIdentity-Methode sein, oder gibt es einen besseren Weg?

Antwort

10

Ja, Sie können auf die Datenbank zugreifen! Code, der in der Configure-Methode ausgeführt wird, kann auf alle Dienste zugreifen, die in der ConfigureServices-Methode hinzugefügt werden, z. B. Datenbankkontexte.

Zum Beispiel, wenn Sie einen einfachen Entity Framework Kontext haben:

using Microsoft.EntityFrameworkCore; 
using SimpleTokenProvider.Test.Models; 

namespace SimpleTokenProvider.Test 
{ 
    public class SimpleContext : DbContext 
    { 
     public SimpleContext(DbContextOptions<SimpleContext> options) 
      : base(options) 
     { 
     } 

     public DbSet<User> Users { get; set; } 
    } 
} 

Und Sie fügen Sie es in ConfigureServices:

services.AddDbContext<SimpleContext>(opt => opt.UseInMemoryDatabase()); 

Dann Sie darauf zugreifen können, wenn Sie die Middleware-Einrichtung werden :

var context = app.ApplicationServices.GetService<SimpleContext>(); 

app.UseSimpleTokenProvider(new TokenProviderOptions 
{ 
    Path = "/api/token", 
    Audience = "ExampleAudience", 
    Issuer = "ExampleIssuer", 
    SigningCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256), 
    IdentityResolver = (username, password) => GetIdentity(context, username, password) 
}); 

Und schreiben Sie die GetIdentity Methode ein litt le:

private Task<ClaimsIdentity> GetIdentity(SimpleContext context, string username, string password) 
{ 
    // Access the database using the context 
    // Here you'd need to do things like hash the password 
    // and do a lookup to see if the user + password hash exists 
} 

Ich bin der Autor der ursprünglichen Probe. Sorry es war anfangs nicht klar! Ich habe versucht, den Delegierten IdentityResolver auf eine Weise zu schreiben, die es einfach macht, eigene Funktionen bereitzustellen - wie die Integration in Ihre eigene Datenbank (wie oben) oder die Anbindung an die ASP.NET Core Identity. Natürlich kannst du meinen Code wegwerfen und auch etwas besseres tun. :)

+3

Wenn Sie JWT aspnet Identität gerade erst hinzugefügt, können Sie die signinmanager anstelle des DbContext passieren kann: var userManager = app.ApplicationServices .GetService (typeof (UserManager )) – xcud

+0

@xcud Das ist genau das, was ich versuche, aber einen Fehler zu bekommen "Kann den Scoped Service 'Microsoft.AspNetCore.Identity.UserManager' nicht auflösen", Was fehlt mir hier? –

0

Ich könnte falsch sein auf einer anderen Ebene, aber die Lösung, die ich gefunden habe, ist einen Bereich erstellen.

habe ich die App anstelle des CTX in GetIdentity, dann in GetIdentity einen Bereich mit:

using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope()) { 
    if (serviceScope.ServiceProvider.GetService<YourAppDbContext>() != null) 
    { 
     var ctx = serviceScope.ServiceProvider.GetService<YourAppDbContext>(); 

     if (AnAuthenticateMethodHereMaybe(ctx, username, password)) { 
     return Task.FromResult(new ClaimsIdentity(new 
GenericIdentity(username, "Token"), new Claim[] { })); 
     } 
    } 
    }