2016-08-02 26 views
9

Kısa bir süre önce .NET Core web API üzerinde çalışıyorum. Sadece https://stormpath.com/blog/token-authentication-asp-net-core numaralı rehberi izleyerek JWT'yi kullanarak kimlik doğrulamayı denedim.ASP.NET Çekirdeğinde başlangıç ​​sırasında veritabanına erişebilir miyim?

GetIdentity yönteminde kodlanmış kullanıcı adı ve parolaları bir DB sorgusuyla değiştirmek zorunda kaldım ve bu dosyadan DB'ye nasıl erişeceğimi bilmediğime kadar her şey iyi gidiyordu! aşağıdaki gibi

Ben https://github.com/nbarbettini/SimpleTokenProvider/blob/master/test/SimpleTokenProvider.Test/Startup.Auth.cs

Benim sorulara hat 70. aşağıdaki linke gösterilmiştir kastediyorum yöntemdir.

  1. Veritabanına buradan erişebilir miyim? Öyleyse nasıl?
  2. GetIdentity yönteminin nerede olduğu veya daha iyi bir yolu var mı?

cevap

10

Evet, veritabanına erişebilirsiniz! Configure yönteminde çalışan kod, veritabanı bağlamları gibi şeyler de dahil olmak üzere ConfigureServices yönteminde eklenen tüm hizmetlere erişebilir. Basit bir varlık Framework bağlamı varsa

Örneğin,:

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

Ve ConfigureServices bunu ekleyin:

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

Sonra erişebilirsiniz sen ortakatmanını ayarlarken :

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

Ve GetIdentity yöntemini bir Litt yeniden 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 
} 

Orijinal örnektir. Üzgünüm başlangıçta açık değildi! IdentityResolver delegesini, kendi veritabanınızı (yukarıdaki gibi) entegre ederek veya ASP.NET Çekirdek Kimliğine ulaştırmak gibi kendi işlevlerinizi sağlamayı kolaylaştıracak şekilde yazmaya çalıştım. Tabii ki, kodumu atmak ve daha iyi bir şey yapmakta özgürsünüz. :)

+3

:

Bir kapsamı kullanarak GetIdentity sonra yerine GetIdentity içinde CTX uygulamayı geçti var userManager = app.ApplicationServices .GetService (typeof (UserManager )) – xcud

+0

@xcud Bunu yapmaya çalıştığım şey tam olarak değil, "Hatalı hizmetin çözümü açılamıyor" Microsoft.AspNetCore.Identity.UserManager', " ben burada neyi özlüyorum –

0

Başka bir düzeyde yanlış olabilirim ama bulduğum çözüm bir kapsam oluşturmaktır. Sadece aspnet kimliğine JWT'yi ekliyorsanız, bunun yerine DBContext ait signinmanager geçebilir

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[] { })); 
     } 
    } 
    }