InvalidOperationException при входе в IdentityServer4 через oidc-клиент - PullRequest
0 голосов
/ 25 июня 2018

У меня возникли некоторые проблемы с установлением потока аутентификации между веб-приложением Vue.js + ASP.NET Core 2.1 с IdentityServer4. Кажется, мне не хватает чего-то очень простого, но я не уверен, что именно.Я хочу иметь следующее:

  1. REST API (http://localhost:7000) защищены через IdentityServer4 (http://localhost:5000)
  2. Пользователь открывает мое ядро ​​asp.netвеб-приложение (http://localhost:6666), щелкает логин
  3. JavaScript передает конфигурацию и использует signinredirect для отправки браузера в приложение IdentityServer4
  4. Пользователь вводит данные для входа и отправляет
  5. браузер перенаправляет понастройка для моего основного веб-приложения asp.net с успешными данными для входа
  6. Теперь пользователь может получить доступ к API REST через основное веб-приложение asp.net

, которое можно получить из моего vue + webapp -> IdentityServer4 интерфейс быстрого входа в систему, и он представляет следующий интерфейс входа:

IdentityServer4 интерфейс быстрого запуска

Я использую тестовые учетные записи пользователей «bob» и «alice»", после ввода идентификатора пользователя и пароля для Алисы и попытки войти в систему, я получаю следующую ошибку:

Произошло необработанное исключение при обработке запроса.

InvalidOperationException:Обработчик аутентификации, зарегистрированный для схемы Bearer, - это IdentityServerAuthenticationHandler, который нельзя использовать для SignInAsync.Зарегистрированные схемы входа: idsrv, idsrv.external.

Microsoft.AspNetCore.Authentication.AuthenticationService.SignInAsync (контекст HttpContext, строковая схема, принципал ClaimsPrincipal, свойства AuthenticationProperties)

Моя конфигурация клиента:

new Client
    {
        ClientId = "js",
        ClientName = "JavaScript Client",
        AllowedGrantTypes = GrantTypes.Implicit,
        AllowAccessTokensViaBrowser = true,

        RedirectUris =           { "http://localhost:6666/static/account/callback.html" },
        PostLogoutRedirectUris = { "http://localhost:6666" },
        AllowedCorsOrigins =     { "http://localhost:6666" },

        // scopes that client has access to
        AllowedScopes =
        {
            IdentityServerConstants.StandardScopes.OpenId,
            IdentityServerConstants.StandardScopes.Profile,
            "api1"
        }
    }

Конфигурация для моего клиента javascript (TypeScript):

// Authentication init code
idConfig: Oidc.UserManagerSettings = {
    authority: "http://localhost:5000",
    client_id: "js",
    redirect_uri: "http://localhost:6666/static/account/callback.html",
    response_type: "id_token token",
    scope: "openid profile castlepoint",
    post_logout_redirect_uri: "http://localhost:6666",
} as Oidc.UserManagerSettings;

, и мой код входа в систему JavaScript:

public login() {
    this.userManager.signinRedirect();
}

У меня такое ощущение, что я неправильно комбинирую поток входа в систему на клиентском компьютере с потоком автоматического входа в систему, но я не уверен ...

Журналы из ID4 говорят в основном так же, как указано выше:

System.InvalidOperationException: обработчик аутентификации, зарегистрированный для схемы 'Bearer', является 'IdentityServerAuthenticationHandler', который не может использоваться для SignInAsync.Зарегистрированные схемы входа: idsrv, idsrv.external.

Мой ID4 startup.cs имеет следующую запись:

public void ConfigureServices(IServiceCollection services)
    {

        // configure identity server with in-memory stores, keys, clients and scopes
        services.AddIdentityServer()
            .AddDeveloperSigningCredential()
            .AddInMemoryApiResources(Config.GetApiResources())
            .AddInMemoryIdentityResources(Config.GetIdentityResources())
            .AddInMemoryClients(Config.GetClients())
            .AddTestUsers(Config.GetUsers());

        services.AddMvcCore()
           .AddAuthorization()
           .AddJsonFormatters();

        services.AddAuthentication("Bearer")
            .AddIdentityServerAuthentication(options =>
            {
                options.Authority = "http://localhost:5000";
                options.RequireHttpsMetadata = false;

                options.ApiName = "api1";
            });

        services.AddCors(options =>
        {
            // this defines a CORS policy called "default"
            options.AddPolicy("default", policy =>
            {
                policy.WithOrigins("http://localhost:6666")
                    .AllowAnyHeader()
                    .AllowAnyMethod();
            });
        });

        services.AddMvc();

}

Извините за дамп длинного кода ...Кто-нибудь может указать на легкую часть, которую я не понял правильно?У меня где-то пересеклись провода с требуемым типом аутентификации и требуемой конфигурацией ... Я думаю ...

1 Ответ

0 голосов
/ 26 июня 2018

ОК, я наконец-то понял.

Вызов DI services.AddAuthentication ("Bearer") добавил аутентификацию ASP.NET для Startup.cs в моем веб-приложении IdentityServer4, чтобы реализоватьПроверка токена доступа на предъявителя.Но это не подходящее место для этого - это должно было быть в моем веб-приложении API, поскольку это то, что API должен использовать для аутентификации вызовов, сделанных к нему.

Веб-приложение IdentityServer4подразумевал принятие идентификатора пользователя + пароль для аутентификации, но с добавленным DI я также требовал токен доступа Bearer как часть аутентификации.Это в основном запутало вещи, и почему это было несовместимо со схемой входа.У меня был правильный код, но в неправильном приложении!

Перемещение AddAuthentication («Bearer») в мое веб-приложение API решило всю проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...