Не удается заставить работать аутентификацию в .NET Core 2.2 и Identity Server 4.

Этот вопрос будет разрешен через два дня, но до этого мне нужна помощь.

Я запускаю два проекта в одном решении. Один из них — мой поставщик идентификаторов (я использую IDS4), а другой — простой клиент MVC (с двумя методами на контроллере — Home/Open и Home/Secured). , Последний украшен атрибутом Авторизовать.

Когда я пытаюсь получить доступ к открытому, он ведет себя как положено. Защищенный, однако, выдает мне ошибку 401, но не возвращается на страницу входа. Я совершенно уверен, что упустил что-то важное в настройке клиента или сервера.

На стороне поставщика идентификаторов у меня есть следующее.

public void ConfigureServices(IServiceCollection services)
{
  services.AddIdentity<IdentityUser, IdentityRole>()
    .AddDefaultTokenProviders();

  services.AddIdentityServer()
    .AddDeveloperSigningCredential()
    .AddInMemoryPersistedGrants()
    .AddInMemoryApiResources(ApiResources)
    .AddInMemoryClients(Clients)
    .AddTestUsers(Users)
    .AddInMemoryIdentityResources(IdentityResources);

  services.AddAuthentication()
    .AddJwtBearer(_ =>
    {
      _.Authority = "https://localhost:5000";
      _.Audience = "http://localhost:5001";
    });
}

public IEnumerable<Client> Clients => new[]
{
  new Client
  {
    ClientId = "MvcClient",
    ClientName = "MVC Client",

    AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,
    AllowOfflineAccess = true,
    RequireConsent = false,
    ClientSecrets = { new Secret("MvcSecret".Sha256(), DateTime.Now.AddMinutes(2)) },

    RedirectUris = { "http://localhost:5000/signin-oidc" },
    PostLogoutRedirectUris = { "http://localhost:5002/" },

    AllowedScopes =
    {
      IdentityServerConstants.StandardScopes.OpenId,
      IdentityServerConstants.StandardScopes.Profile,
      IdentityServerConstants.StandardScopes.Email,
    }
  }
};

Я убедился, что ввод вручную http://localhost:5000/signin-oidc/ я увижу расположенный там документ index.html. Я ожидал, что когда я попытаюсь получить доступ к защищенной странице, я попаду туда. Вместо этого я получаю только простую ошибку 401.

На стороне клиента MVC у меня есть следующее.

public void ConfigureServices(IServiceCollection services)
{
  services.AddMvc();

  JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

  services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(_ =>
    {
      _.Authority = "http://localhost:5000";
      _.Audience = "http://localhost:5002";
      _.SaveToken = true;
      _.RequireHttpsMetadata = false;
      _.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true };
    })
    .AddOpenIdConnect(_ => { _.ClientId = "mvc_client"; });
}

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

Я исследовал его в течение нескольких дней, и мое мнение таково, что официальное руководство неясно, начинает устаревать и, что является наиболее запутанной частью, немного перескакивает между темами без красной нити. Все примеры и блоги, которые я видел (а я видел много), не будут работать на моей машине или окажутся недействительными для последней версии .NET Core (на данный момент это 2.2). ближайший тоже не работал, и я подозреваю, что нет смысла тратить время на устранение неполадок. .


person Konrad Viltersten    schedule 07.01.2019    source источник
comment
Можем ли мы увидеть этот класс IdServerConfiguration?   -  person eVolve    schedule 07.01.2019
comment
@eVolve Не уверен, что ты имеешь в виду, приятель. Первый пример находится в классе конфигурации для проекта, в котором работает мой Identity Server, если вы об этом спрашиваете. Пожалуйста, объясните, если я неправильно понимаю.   -  person Konrad Viltersten    schedule 07.01.2019
comment
В своем коде вы называете это .AddInMemoryClients(IdServerConfiguration.Clients), но то, как код отображается здесь, выглядит так, будто клиенты относятся к классу запуска.   -  person eVolve    schedule 08.01.2019
comment
@eVolve Ах, извините за путаницу. Я изо всех сил старался сделать код информативным, но кратким. Класс IdServerConfiguration — это просто удобный класс, в котором хранятся определения клиентов. Это то же самое, как если бы определение клиента было помещено непосредственно в метод AddInMemoryClients(new[]{new Client{...}}).   -  person Konrad Viltersten    schedule 08.01.2019
comment
@eVolve Я обновил исходный код, чтобы лучше понять то, что заставило вас спросить.   -  person Konrad Viltersten    schedule 08.01.2019
comment
Не уверен, какие порты вы используете для каких проектов, но все примеры IDS4 используют 5000 для реализации IDS4. Я заметил, что в конфигурации вашего клиента у вас есть перенаправление, указывающее на localhost: 5000/signin-oidc. Является ли 5000 вашим портом IDS4 или портом для вашего приложения MVC? Он должен указывать на порт для вашего приложения MVC. Кроме того, примеры QuickStart из IDS4 используют неявный тип предоставления для MVC. Ваша конфигурация использует Hybrid. Также может быть связано с вашей проблемой.   -  person user1011627    schedule 08.01.2019
comment
@user1011627 user1011627 Ага, может быть, мы что-то здесь нашли. Просто чтобы было максимально понятно. RedirectUris, который был установлен на localhost:5000/signin-oidc (5000 — мой порт IDS4), теперь установлен на localhost:5002/home/login (5002 — мой порт приложения MVC). т.е. Я использую контроллер Home и метод LogIn вместо статического файла index.html в каталоге с именем signin-oidc. Это правильно? (Я не уверен, какое соглашение я должен вводить точно, и что это просто имя, которое я могу установить по своему желанию. Что касается неявного, я думал, что это только для SPA, но я тоже пробовал с ним.Тогда такая же проблема.   -  person Konrad Viltersten    schedule 08.01.2019
comment
Для параметра RedirectUri должно быть задано значение localhost:5002/signin-oidc. PostLogoutRedirectUri должен иметь значение localhost:5002/signout-callback-oidc. Маршруты к этим URI управляются промежуточным программным обеспечением OIDC и должны быть в этом формате. Если вы хотите изменить их, вы должны указать URL-адрес в CallBackPath в параметрах OIDC при его настройке.   -  person user1011627    schedule 08.01.2019
comment
Поскольку вы не показали часть требуемой конфигурации, я должен предположить, что вы все правильно подключили. Вещи, которые я не вижу, необходимы: 1) MVC Startup.cs должен иметь вызов UseAuthentication в методе Configure. 2) IDS4 Startup.cs должен иметь вызов UseIdentityServer в методе Configure.   -  person user1011627    schedule 08.01.2019
comment
тебе все еще нужна помощь?   -  person Mohamed Elrashid    schedule 09.01.2019
comment
@MohamedElrashid Да, я все еще делаю. Я был в больнице некоторое время и не мог бороться с проблемой. Извини за это. У вас есть понимание моей проблемы или, возможно, вопрос для уточнения детали?   -  person Konrad Viltersten    schedule 13.01.2019
comment
@user1011627 Извините за молчание - внеплановый визит в больницу. Я хотел бы подтвердить три вещи, касающиеся вашей разработки RedirectUri. (1) Когда вы говорите RedirectUri, вы имеете в виду следующее, правильно: RedirectUris = {localhost:5002/signin-oidc}? (2) У меня нет контроллера/действия, настроенного на этой конечной точке в моем приложении MVC. Должен ли я реализовать страницу по этому адресу? Например. статическая страница с именем localhost:5002/signin-oidc/index.html или, возможно, что-то с [HttpGet(signin-oidc]. (3) Должно быть дословно .../signin-oidc или я могу установить .../security/login?   -  person Konrad Viltersten    schedule 13.01.2019
comment
1) Правильно 2) Нет, маршрут signin-oidc обрабатывается промежуточным программным обеспечением. 3) Насколько я понимаю, вы можете изменить его, но я этого не сделал, поэтому не могу дать указаний по этому поводу. Вот хорошее объяснение другого вопроса/ответа. stackoverflow .com/questions/45458612/   -  person user1011627    schedule 14.01.2019
comment
@user1011627 user1011627 Я подозреваю, что с моей настройкой что-то еще не так. Я понял, что у меня должен быть доступ к странице входа на сервере ID, но когда я перехожу к localhost:5000/connect/authorize, я ничего не получаю. Или мне нужно реализовать это самому?   -  person Konrad Viltersten    schedule 15.01.2019
comment
Можете ли вы перейти к известной конфигурации IDS?   -  person user1011627    schedule 15.01.2019
comment
@user1011627 user1011627 Да, я получаю список, который для меня выглядит так, как должен. Включая строку с авторизацией endpont. Однако щелчок там не приводит меня ни к одной странице.   -  person Konrad Viltersten    schedule 18.01.2019