Получение 401 доступа к защищенной странице с помощью JwtToken в IDS4 и ASP.NET Core 2.2 - PullRequest
0 голосов
/ 14 января 2019

Я настроил клиента MVC, добавив следующие строки.

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  .AddJwtBearer();

Сообщение об ошибке, как и ожидалось, было 401 Unauthorized. Поэтому я добавил конфигурацию для носителя в соответствии с предложением Microsoft .

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

В моем решении порт 5000 является хостом провайдера IDS4, а порт 5002 - приложением MVC. В этот момент я получил ошибку, потому что на данный момент я использую строго HTTP. Было предложено снизить уровень безопасности, установив RequireHttpsMetadata в false , что я и сделал, как показано ниже.

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  .AddJwtBearer(_ =>
  {
    _.Authority = "http://localhost:5000";
    _.Audience = "http://localhost:5002";
    _.RequireHttpsMetadata = false;
  })

К моему разочарованию, я снова получаю 401 Unauthorized в моем браузере, когда запрашиваю страницу в действии, украшенную [Authorize] .

Я не уверен, как диагностировать это дальше. Я пытаюсь сравнить мой код с gazillion примеров, но не вижу существенной разницы. Кроме того, многие примеры относятся к другой версии Core, IDS или схемы. Мне нужно посоветовать, откуда может исходить запах.

1 Ответ

0 голосов
/ 14 января 2019

Из образцов IdentityServer4 вы можете видеть, что они используют AddOpenIdConnect, а не AddJwtBearer для образца клиента MVC. Ваша регистрация службы клиента MVC должна выглядеть следующим образом:

        services.AddAuthentication(options =>
            {
                options.DefaultScheme = "Cookies";
                options.DefaultChallengeScheme = "oidc";
            })
            .AddCookie("Cookies")
            .AddOpenIdConnect("oidc", options =>
            {
                options.SignInScheme = "Cookies";

                options.Authority = "http://localhost:5000";
                options.RequireHttpsMetadata = false;

                options.ClientId = "mvc";
                options.SaveTokens = true;
            });

Наконец, убедитесь, что у вас есть клиент, которому разрешена область доступа к вашему API-ресурсу, и соответствующий тип гранта:

            // OpenID Connect implicit flow client (MVC)
            new Client
            {
                ClientId = "mvc",
                ClientName = "MVC Client",
                AllowedGrantTypes = GrantTypes.Implicit,

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

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

AddOpenIdConnect в основном предварительно настраивает конечные точки обработчика для обратных вызовов из IDS4 для входа и выхода пользователя, а также создает соответствующие ClaimsPrincipal.

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