2016-08-02 7 views
9

Niedawno pracowałem nad interfejsem internetowym .NET Core. Właśnie próbowałem uwierzytelnienia przy użyciu JWT, postępując zgodnie z instrukcją na temat https://stormpath.com/blog/token-authentication-asp-net-core.Czy mogę uzyskać dostęp do bazy danych podczas uruchamiania w środowisku ASP.NET Core?

Wszystko szło dobrze, dopóki nie musiałem zastąpić zakodowanej nazwy użytkownika i haseł w metodzie GetIdentity za pomocą zapytania DB i zdałem sobie sprawę, że nie wiem, jak uzyskać dostęp do bazy danych z tego pliku!

Metoda mam na myśli jest pokazany w linku poniżej na linii 70. https://github.com/nbarbettini/SimpleTokenProvider/blob/master/test/SimpleTokenProvider.Test/Startup.Auth.cs

moje pytania są następujące.

  1. Czy mogę uzyskać dostęp do bazy danych? Jeśli tak to jak?
  2. Czy powinno to być miejsce, w którym znajduje się metoda GetIdentity, czy też jest lepszy sposób?

Odpowiedz

10

Tak, można uzyskać dostęp do bazy danych! Kod działający w metodzie Configure może uzyskać dostęp do usług dodanych w metodzie ConfigureServices, w tym do kontekstów bazy danych.

Na przykład, jeśli masz prosty kontekstu Entity Framework:

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

I dodać go ConfigureServices:

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

Następnie można do niego dostęp podczas konfigurowania middleware :

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

Przepisz przepis na metodę GetIdentity 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 
} 

Jestem autorem oryginalnej próbki. Niestety początkowo nie było jasne! Próbowałem napisać delegata IdentityResolver w sposób, który ułatwia zapewnienie własnej funkcjonalności - na przykład integrację z własną bazą danych (jak wyżej) lub podłączenie go do ASP.NET Core Identity. Oczywiście, możesz wyrzucić mój kod i zrobić coś lepszego. :)

+3

Jeśli jesteś po prostu dodanie JWT tożsamości aspnet, można zdać signinmanager zamiast dbcontext: var userManager = app.ApplicationServices .GetService (typeof (UserManager )) – xcud

+0

@xcud Dokładnie to próbuję zrobić, ale dostaję błąd "Nie można rozwiązać zakresu usługi" Microsoft.AspNetCore.Identity.UserManager' ", czego tu brakuje? –

0

Mogę się mylić na jakimś innym poziomie, ale rozwiązaniem, które znalazłem, jest stworzenie zakresu.

zdałem aplikację zamiast CTX w getIdentity, następnie w getIdentity użyciu zakresu:

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[] { })); 
     } 
    } 
    } 
Powiązane problemy