是的,你可以訪問數據庫!在Configure
方法中運行的代碼可以訪問在ConfigureServices
方法中添加的任何服務,包括數據庫上下文等內容。
舉例來說,如果你有一個簡單的實體框架背景:
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; }
}
}
你添加它ConfigureServices
:
services.AddDbContext<SimpleContext>(opt => opt.UseInMemoryDatabase());
然後,您可以訪問它,當你正在設置的中間件:
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)
});
並重寫GetIdentity
方法a 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
}
我是原始樣本的作者。對不起,最初並不清楚!我試圖以一種方式編寫IdentityResolver
委託,這樣可以很容易地提供自己的功能 - 比如與您自己的數據庫集成(如上所述),或者將它連接到ASP.NET Core Identity。當然,你可以自由地扔掉我的代碼並做更好的事情。 :)
如果你剛加入智威湯遜到ASPNET身份,你可以通過替代的DbContext的signinmanager: var userManager = app.ApplicationServices .GetService(typeof(UserManager)) –
xcud
@xcud這正是我想要做的,但得到一個錯誤「無法解決範圍服務'Microsoft.AspNetCore.Identity.UserManager'」,我在這裏錯過了什麼? –