Как я могу добавить AspNetIdentity к своему API с IdentityServer4 - PullRequest
0 голосов
/ 26 июня 2018

Я создаю ядро ​​приложения .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? Что мне нужно сделать, чтобы исправить эту ошибку аутентификации?

Спасибо

1 Ответ

0 голосов
/ 17 октября 2018

Попробуйте использовать этот код

services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...