Chrome SameSite: Identity Server 4 (поток кода) + Web API Core 3.1 + Angular 8 - PullRequest
0 голосов
/ 15 марта 2020

Наше приложение выглядит следующим образом:

  • Identity.Web (localhost: 5555) -. Net Core 3.1: в нем есть бритвенные страницы для сброса логина и пароля. Мы используем Identity Server 4 (Поток кода - Oauth 2.0, OpenId).
  • Web.Api (localhost: 4500). Net Core 3.1: в основном имеет API ресурсов
  • Angular 8 (localhost: 4200): использование клиента open-id для аутентификации и доступа к API ресурсов.

Наше приложение работало идеально до Chrome SameSite Updates, Теперь, когда мы вводим имя пользователя и пароль для входа (Identity.Web - localhost: 5555), браузер перенаправляет на (Angular 8 - localhost: 4200), а затем обратно обратно на страницу входа.

Прежде, раньше был обратный вызов авторизации, затем войдите в панель управления.

Ниже вы найдете нашу конфигурацию:

Identity.Web (config.cs)

        var redirectUris = new List<string> { frontendUrl + "/auth-callback", frontendUrl + "/silent-refresh.html" };

        var allowedCorsOrigins = new List<string> { frontendUrl };

        var postLogoutRedirectUris = new List<string> { frontendUrl + "/signout-callback-oidc" };

        return new List<Client>
        {
           new Client
           {
                RequireConsent = false,
                ClientId = "angular_spa",
                ClientName = "Angular 4 Client",
                AllowedGrantTypes = GrantTypes.Code,
                RequirePkce = true,
                RequireClientSecret = false,
                AllowedScopes = new List<string> {"openid", "profile", "api1"},
                RedirectUris = redirectUris,
                PostLogoutRedirectUris = postLogoutRedirectUris,
                AllowedCorsOrigins = allowedCorsOrigins,
                AllowAccessTokensViaBrowser = true,

           }
        };

Identity.Web (Startup.cs)

 var settings = Configuration.GetSection(nameof(MongoDbSettings)).Get<MongoDbSettings>();

        var mongoDbContext = new MongoDbContext(settings.ConnectionString, settings.DatabaseName);

        services.AddIdentity<ApplicationUser, MongoIdentityRole>()
                .AddMongoDbStores<ApplicationUser, MongoIdentityRole, Guid>(mongoDbContext)
                .AddDefaultTokenProviders();

        services.Configure<MongoSettings>(options =>
        {
            options.ConnectionString = Configuration.GetSection("MongoDbSettings:ConnectionString").Value;
            options.DatabaseName = Configuration.GetSection("MongoDbSettings:DatabaseName").Value;
        });


        services.AddIdentityServer(options => { options.Events.RaiseSuccessEvents = true; })
                .AddDeveloperSigningCredential()
                .AddAspNetIdentity<ApplicationUser>()
                .AddProfileService<ProfileService>()
                .AddMongoRepository()
                .AddClients()
                .AddIdentityApiResources();

Web.Api (Startup.cs)

services.AddAuthentication()
                  .AddIdentityServerAuthentication("api1", options =>
                  {
                      options.Authority = Configuration.GetSection("IdentityServer:BaseUrl").Value;
                      options.RequireHttpsMetadata = false;
                      options.ApiName = "api1";
                      options.TokenRetriever = (request) =>
                      {
                          string token = TokenRetrieval.FromAuthorizationHeader().Invoke(request);
                          if (string.IsNullOrEmpty(token))
                          {
                              token = TokenRetrieval.FromQueryString().Invoke(request);
                          }
                          return token;
                      };
                  });

Примечание: Все отлично работает в Firefox. Мы прочитали эту статью и применили то, что есть, но это не сработало.

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

В Google Chrome будет отображаться консольное ограничение, и вашему серверу идентификации не удалось перенаправить в клиентское приложение для Chrome версии 80.

Повар ie, связанный с ресурсом, был установлен с SameSite = Нет, но без Безопасного. Он был заблокирован, так как Chrome теперь доставляет только куки с пометкой SameSite = None, если они также помечены как безопасные. Вы можете просмотреть файлы cookie в инструментах разработчика в разделе «Приложение»> «Хранение»> «Файлы cookie» и просмотреть более подробную информацию по адресу https://www.chromestatus.com/feature/5633521622188032.

. Чтобы исправить это, необходимо внести изменения, указанные в приведенной ниже ссылке, с дополнительными изменениями. упомянуть ниже.

https://www.thinktecture.com/en/identity/samesite/prepare-your-identityserver/

ПРИМЕЧАНИЕ. Для. Net Core 2.2, установите SameSite = (SameSiteMode) (- 1), Для. Net Core 3.0 или выше, установите SameSite = SameSiteMode.Unspecified

Кроме того, для Chrome 80 версии добавьте это дополнительное условие -

 if ( userAgent.Contains("Chrome/8"))
            {
                return true;
            }

Пожалуйста, примите этот ответ, если исправлена ​​ошибка для Chrome .

0 голосов
/ 16 марта 2020
В браузере

Chrome есть кое-что с портом 5555, измените свой порт Identity.Web , надеюсь, он работает.

...