Я создаю ядро приложения .net, у меня нормально работает IdentityServer4 и клиент MVC.
При запуске моего IdentityServer я могу успешно добавить Asp.Net Identity, и я получаю доступ как к собственному UserManager, так и к моему UserContext (который расширяет IdentityDbContext).
У меня также есть API, который мой MVC-клиент (или другие клиенты) может вызывать для получения информации о зарегистрированном пользователе. Этот API успешно опирается на Identity Server и может проверить полученный им access_token, извлечь sud, открыть UserContext (определяется в общей сборке), найти пользователя и прочитать любую пользовательскую таблицу, добавленную в схему. К сожалению, я не могу заставить API зарегистрировать удостоверение Asp.Net и поэтому использовать UserManager для просмотра ролей и других собственных таблиц.
Вот запуск IdentityServer:
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<UserContext>()
.AddDefaultTokenProviders();
services.AddMvc();
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddAspNetIdentity<ApplicationUser>()
.AddConfigurationStore(options =>
{
options.ConfigureDbContext = builder =>
builder.UseSqlServer(IdentityConnectionString,
sql => sql.MigrationsAssembly(migrationsAssembly));
})
.AddOperationalStore(options =>
{
options.ConfigureDbContext = builder =>
builder.UseSqlServer(IdentityConnectionString,
sql => sql.MigrationsAssembly(migrationsAssembly));
});
}
При этом запуске для API запрос успешно обрабатывается:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<UserContext>(options =>
options.UseSqlServer(UserDbConnectionString));
services.AddMvcCore()
.AddAuthorization()
.AddJsonFormatters();
services
.AddAuthentication("Bearer")
.AddIdentityServerAuthentication(options =>
{
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.ApiName = "api1";
});
}
Консольный вывод запроса GET (с предоставленным токеном) выглядит следующим образом
информация: Microsoft.AspNetCore.Hosting.Internal.WebHost [1]
Запрос запуска HTTP / 1.1 GET http://localhost:5001/authorisation
информация: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler [2]
Успешно подтвержден токен.
info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler [8]
AuthenticationScheme: BearerIdentityServerAuthenticationJwt был успешно аутентифицирован.
info: IdentityServer4.AccessTokenValidation.IdentityServerAuthenticationHandler [8]
AuthenticationScheme: канал передачи успешно прошел аутентификацию.
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService [1]
Авторизация прошла успешно для пользователя: Джо Блок.
Если я добавлю Asp.Net Identity при запуске API, как это:
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<UserContext>()
.AddDefaultTokenProviders();
Тогда запрос завершается неудачно, в журнале говорится, что пользователь «нулевой».
info: Microsoft.AspNetCore.Hosting.Internal.WebHost [1]
Запрос на запуск HTTP / 1.1 GET http://localhost:5001/authorisation
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService [2]
Авторизация не удалась для пользователя: (пусто).
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker [3]
Авторизация не выполнена для запроса в фильтре 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'.
Это приводит к перенаправлению на страницу входа, которая не существует в API и, следовательно, 404.
Я попытался добавить вызов .AddAspNetIdentity () в API, но, похоже, он не распознается после AddIdentityServerAuthentication
Можно ли получить доступ API к Asp.Net Identity UserManager?
Что мне нужно сделать, чтобы исправить эту ошибку аутентификации?
Спасибо