Постоянный редирект IdentityServer3 при входе только на мобильный - PullRequest
0 голосов
/ 18 ноября 2018

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

При первом входе на сервер идентификации я вхожу в систему, а затем при перенаправлении обратно в приложение автоматически перенаправляется обратно на сервер идентификации и обратно и обратно.

Если я остановлю перенаправление (нажав кнопку остановки в браузере), перейдите на мой сайт, на котором я уже вошел в систему.

Я использую IdentityServer3 и Asp.Net Core.

Журналы для сервера идентификации не показывают ошибок и успешных входов. Это происходит, если я вхожу в систему с внешним провайдером или нестандартным провайдером.

Я думал, что это что-то с Safari, но я установил Chrome на свой телефон, и он делает то же самое.

Я провел некоторое исследование и не думаю, что это проблема http / https, и я не могу добавить Session_start, потому что он не существует в ядре.

Может кто-нибудь придумать причину, по которой мобильное приложение не будет работать, пока настольное приложение работает нормально? Любые предложения по любым другим журналам, которые я могу проверить или что я могу попробовать?

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(options =>
    {
        options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
        options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    })
    .AddCookie(options =>
    {
        options.LoginPath = new PathString("/Login/Login/");
        options.AccessDeniedPath = new PathString("/Login/Login/");
    })
    .AddOpenIdConnect(options =>
    {
        options.Authority = _authenticationServer;
        options.ClientId = "...";
        options.ResponseType = "id_token";
        options.Scope.Add("openid");
        options.Scope.Add("email");
        options.Scope.Add("profile");
        options.UseTokenLifetime = false;

        options.TokenValidationParameters = new TokenValidationParameters
        {
            NameClaimType = "name",
            ValidateIssuer = false,
        };
        options.Events = new OpenIdConnectEvents
        {
            OnTokenValidated = context =>
            {
                ...
                return Task.CompletedTask;
            }
        };
    });

    services.AddMvc(config =>
    {
        var policy = new AuthorizationPolicyBuilder()
                            .RequireAuthenticatedUser()
                            .Build();
        config.Filters.Add(new AuthorizeFilter(policy));
    })
    .AddJsonOptions(options =>
            options.SerializerSettings.ContractResolver = new DefaultContractResolver());

    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    services.AddSingleton(Configuration);
    services.AddMemoryCache();
    services.AddSession();
    services.AddKendo();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }
    app.UseStaticFiles();
    app.UseSession();
    app.UseAuthentication();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
    });
}

UPDATE:

Я проверил, что это проблема только на iPhone. Андроид работает нормально. Я также подтвердил, что это проблема клиентского приложения .Net Core. Стандартное клиентское приложение .Net работает нормально.

Моя конечная точка авторизации вызывается в бесконечном цикле.

Кто-нибудь успешно настроил основное клиентское приложение .Net на сервере идентификации и работает ли он через браузер iphone? Любая помощь?!?

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

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

Я подозреваю, что любой, кто пытается использовать OpenIdConnect с Asp.Net Core (не уверен, что это должен быть IdentityServer), получит эту регистрацию на iPhone.

Это просто обходной путь, пока я не смогу точно выяснить, почему он перенаправляет. Я подключаюсь к событию redirect и проверяю, существует ли заголовок источника. В первый раз, когда он перенаправляет на сервер идентификации, источник установлен, но во второй раз не установлен. Если он не установлен, я проверяю, является ли это мобильным телефоном. Если это так, я прекращаю действие по умолчанию (постоянное перенаправление) и сразу перехожу к своему URL.

Это работает, потому что пользователь фактически вошел в систему успешно, даже если он перенаправляет. Вот почему это так странно.

options.Events = new OpenIdConnectEvents
{
    OnRedirectToIdentityProvider = x =>
    {
        if (!string.IsNullOrWhiteSpace(x.Request.Headers["Origin"]))
        {
            string userAgent = x.Request.Headers["User-Agent"];
            if (IsMobileBrowser(userAgent))
            {
                x.HandleResponse();
                x.Response.Redirect(<url>);
            }
        }
        return Task.CompletedTask;
   },
0 голосов
/ 03 января 2019

Это похоже на ту же проблему, с которой я столкнулся ( Требуется руководство по диагностике аутентификации бесконечного цикла на ios (safari и chrome) с сервером идентификации 4 ).В моем случае это проблема только на iphone и связана с IOS12.Подробная информация об обходе здесь:

GitHub aspnet core выпуск 4647

0 голосов
/ 19 ноября 2018

Скорее всего, это проблема хранения файлов cookie.Существуют ограничения на размер файлов cookie, которые варьируются от браузера к браузеру.

  1. После успешного входа браузер перенаправляется
  2. Сервер пытается установить файл cookie
  3. Если размер файла cookie превышаетОграничение: браузер выдает предупреждение в консоли, что cookie будет игнорироваться
  4. Страница перезагружается, но не устанавливается cookie аутентификации, поэтому браузер перенаправляется на страницу входа
  5. Часто "запомнитьопция me "включена, поэтому цикл начинается с шага 1

Попробуйте уменьшить размер файла cookie.

...