Nano Hash - криптовалюты, майнинг, программирование

Настройки IdentityServer4 CORS с EntityFramework

РЕДАКТИРОВАТЬ: я частично ответил на свой вопрос. Для тех, кому интересно, в базе данных есть еще одна таблица с именем ClientProperties, которую вы можете использовать для установки других свойств, не входящих в основную клиентскую таблицу. Я сделал это, но ошибка осталась: введите здесь описание изображения

Моя запись для конфигурации клиента выглядит так: введите здесь описание изображения

Работая над этим дальше (я вручную определил политику содержимого), это ошибка, на которой я застрял: введите здесь описание изображения

--------------------- Исходный вопрос ---------------------

У меня есть настройка IdentityServer4 с использованием EntityFramework для моих данных конфигурации и операций.

Я столкнулся с проблемой при попытке разрешить ajax обрабатывать перенаправления при входе в приложение. Вместо того, чтобы пытаться жестко запрограммировать все, я пытался настроить CORS в IDS4.

Я читал документ ЗДЕСЬ. В нем говорится о настройке AllowedCorsOrigins на клиенте, чтобы сервер идентификации правильно настроил CORS. Проблема, с которой я сталкиваюсь, заключается в том, что в базе данных у клиентов нет столбца с именем AllowedCorsOrigins. На самом деле в модели openId отсутствует много столбцов. /а>.

На моем сервере идентификации моя конфигурация DI выглядит следующим образом:

services.AddIdentity < IdentityUser, IdentityRole > ()
  .AddUserManager < ApplicationUserManager < IdentityUser >> ()
  .AddSignInManager < ApplicationSignInManager < IdentityUser >> ()
  .AddEntityFrameworkStores < ApplicationDbContext > ();

services.AddIdentityServer()
  .AddAspNetIdentity < IdentityUser > ()
  .AddConfigurationStore(options => {
    options.ConfigureDbContext = builder => builder.UseSqlServer(
      configuration.GetConnectionString("IdentityConnection"),
      opt => opt.MigrationsAssembly(startupName));
  })
  .AddOperationalStore(options => {
    options.ConfigureDbContext = builder => builder.UseSqlServer(
      configuration.GetConnectionString("IdentityConnection"),
      opt => opt.MigrationsAssembly(startupName));
  })
  .AddProfileService < ApplicationProfileService < IdentityUser >> ()
  .AddDeveloperSigningCredential();

И на моем клиенте настройка DI выглядит следующим образом:

services.AddAuthentication(options => {
    options.DefaultScheme = "cookie";
    options.DefaultChallengeScheme = "oidc";
  }).AddCookie("cookie")
  .AddOpenIdConnect("oidc", options => {
    options.Authority = appSettings.App.AuthorityUrl;
    options.ClientId = appSettings.App.ClientId;
    options.ClientSecret = appSettings.App.ClientSecret;

    options.ResponseType = ResponseTypes.Code;
    options.UsePkce = true;
    options.ResponseMode = "query";

    options.GetClaimsFromUserInfoEndpoint = true;
    options.ClaimActions.MapJsonKey("role", "role", "role");
    options.ClaimActions.MapJsonKey("nickname", "nickname", "nickname");
    options.ClaimActions.MapJsonKey(JwtClaimTypes.Picture, JwtClaimTypes.Picture, JwtClaimTypes.Picture);
    options.TokenValidationParameters.RoleClaimType = "role";

    var test = options.ClaimActions;

    options.Scope.Add(appSettings.App.Scopes[0]);
    options.SaveTokens = true;
  });

Мне трудно понять, где я должен определять AllowedCorsOrigins, поскольку все примеры, которые я видел, находятся в примерах памяти. Я бы подумал, что это свойство должно быть в базе данных на клиентской таблице...

Вот посмотрите, к каким значениям у меня есть доступ в базе данных:

Таблица базы данных

Наконец, это ошибка в консоли: Ошибка консоли


  • какой браузер вы используете? вы получаете эту ошибку в Chrome? 25.03.2021
  • @nahidf Я только что понял проблему, сообщение ajax не позволит вам сделать перенаправление 302. Я должен справиться с этим по-другому. 25.03.2021

Ответы:


1

Проблема заключается в AJAX.

Поскольку я отправляю форму в конечную точку входа в MVC, ответ не может быть перенаправлением 302. Это связано с тем, что AJAX не позволяет перенаправлять сообщения.

Чтобы исправить это, теперь я возвращаю объект JSON с возвращаемым URL-адресом, а вместо этого javascript устанавливает значение window.location. Ниже приведен пример этого (обратите внимание, я сначала проверяю, является ли это объектом JSON, потому что этот обработчик обрабатывает несколько вызовов ajax).

if (xhr.responseText.startsWith('{')) {
    let json = JSON.parse(xhr.responseText);
    if (json.ok) {
        window.location = json.redirect;
        return;
    }
}
25.03.2021

2

Если вы пытаетесь определить домены, в которых клиент может запрашивать вход, вам нужно настроить это в таблице ClientCorsOrigins. Там вы определите веб-адрес, например https://www.example.com, и идентификатор клиента из таблицы Clients.

Однако, если вы пытаетесь определить конфигурацию CORS для других вызовов API для Identity Server, вам необходимо определить это в своем Startup.cs

services.AddCors(options =>
{
    options.AddPolicy(name: MyAllowSpecificOrigins,
        builder =>
        {
            builder.WithOrigins("http://example.com",
                "http://www.contoso.com");
        });
});
26.03.2021
  • Все это уже пробовал делать. Смотрите мой предыдущий ответ. Не удается выполнить перенаправление 302 в ответе на сообщение AJAX. Спасибо хоть! Тем не менее хорошая информация для других. 26.03.2021
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..