У меня есть существующая база данных с таблицей под названием Users (на самом деле это старая структура таблицы базы данных DotNetNuke 8.1 (например, примерно в 2016 году) с Users, UserRoles и т. Д. c таблицами). Он не соответствует структуре текущего удостоверения Microsoft, например (AspNetUsers, AspNetUserRoles ... et c).
Я хочу добавить уровень проверки подлинности в проект NetCore 3.1, который использует эту базу данных. Мне удалось скомпилировать таблицы базы данных в модели и добавить классы контекста db, чтобы получить доступ к таблице Users.
Как мне добавить IdentityServer4 для аутентификации с именами пользователей и их паролями из таблицы Users. что у меня есть:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(option => option.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
// added for identity server
services.AddIdentityServer()
.AddInMemoryApiResources(Configurations.Configuration.GetApis())
.AddInMemoryClients(Configurations.Configuration.GetClients())
.AddDeveloperSigningCredential();
services.AddTransient<IResourceOwnerPasswordValidator, Configurations.ResourceOwnerPasswordValidator>();
services.AddTransient<IProfileService, Configurations.ProfileService>();
services.AddControllersWithViews();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ApplicationDbContext dbContext)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
// added for identity server
app.UseIdentityServer();
//added
app.UseAuthentication();
app.UseAuthorization();
//added
dbContext.Database.EnsureCreated();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Test}/{action=Index}/{id?}");
});
}
}
Класс конфигурации для IdentityServer4:
public static class Configuration
{
public static IEnumerable<ApiResource> GetApis() =>
new List<ApiResource>
{
new ApiResource("ApiOne") // registering one api with this name
};
public static IEnumerable<Client> GetClients() => // define a client that will consume above api
new List<Client>
{
new Client
{
ClientId = "resClient",
ClientSecrets = { new Secret("topsecret".ToSha256()) }, // make client secret more complex for production, can be made to expire
AllowedGrantTypes = GrantTypes.ClientCredentials, // how client will request the access token
//define what the access token will be allowed to be used for, the scopes
AllowedScopes = { "ApiOne" } // this client will be allowed to access Api One
}
};
}
Класс ProfileService:
public class ProfileService : IProfileService
{
public Task GetProfileDataAsync(ProfileDataRequestContext context)
{
context.IssuedClaims = context.Subject.Claims.ToList();
return Task.FromResult(0);
}
public Task IsActiveAsync(IsActiveContext context)
{
return Task.FromResult(0);
}
}
Я пытаюсь указать имя пользователя и передаю из базы данных (не хешируется, это просто для тестирования), но всегда возвращается:
"unauthorized_client"
введите описание изображения здесь