Аутентификация приложения MVC вызывает бесконечный цикл перенаправления с OpenID Connect 3 - PullRequest
0 голосов
/ 06 мая 2018

ПРОБЛЕМА

У меня проблема с использованием OpenID Connect 3 для предоставления авторизации для веб-сайта, который я разрабатываю.

Проблема выглядит так:

  1. Я захожу на защищенную страницу и перенаправляюсь на IdentityServer (OpenID Connect 3)
  2. Сервер идентификации запрашивает мое имя пользователя и пароль
  3. Эти учетные данные считаются нормальными, и я затем перенаправлен обратно на сайт MVC.
  4. Это то, что идет не так. По какой-то причине сайт остается не прошедшим проверку подлинности и перенаправляет его обратно на Identityserver.
  5. Что касается сервера идентификации, я уже вошел в систему, поэтому он перенаправляет меня обратно в приложение mvc

Шаги 4 и 5 продолжаются вечно ... Что ж, они могли бы, если бы не было достигнуто ограничение максимального количества файлов cookie, которое завершает все.

ПРОБНЫЕ РЕШЕНИЯ

После нескольких дней поиска в Google я попробовал следующее, но пока у меня ничего не работает.

  1. Исправление Cookie Kentor Owin в классе запуска. Функция ConfigureAuth

    app.UseKentorOwinCookieSaver();
    
  2. Вариация 1

    app.UseKentorOwinCookieSaver(PipelineStage.Authenticate);
    
  3. Альтернативный менеджер файлов cookie SystemWebCookieManager

           app.UseCookieAuthentication(new CookieAuthenticationOptions
           {
                AuthenticationType = "Cookies",
               CookieManager = new SystemWebCookieManager()
    
           });
    
  4. Вариант 3 SystemWebChunkingCookieManager

           app.UseCookieAuthentication(new CookieAuthenticationOptions
           {
                AuthenticationType = "Cookies",
                CookieManager = new SystemWebChunkingCookieManager()
    
            });
    
  5. Заглушки сессий в файле Global.asa

        protected void Session_Start()
        {
    
        }
    
        protected void Session_End()
        {
    
        }
    

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

Конфигурация Identity Server

    using Microsoft.Owin;
    using Owin;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using IDServer.Config;
    using IdentityServer3.Core.Configuration;
    using System.Security.Cryptography.X509Certificates;

    [assembly: OwinStartup(typeof(IDServer.Startup))]

    namespace IDServer
    {
        public class Startup
        {

            public void Configuration(IAppBuilder app)
            {

                app.Map("", idsrvApp =>
                {
                    idsrvApp.UseIdentityServer(new IdentityServer3.Core.Configuration.IdentityServerOptions
                    {
                        SiteName = "Identity Server",
                        IssuerUri = "https://localhost:44398/embedded",
                        Factory = new IdentityServerServiceFactory()
                            .UseInMemoryClients(Clients.Get())
                            .UseInMemoryScopes(Scopes.Get())
                            .UseInMemoryUsers(Users.Get()),

                        SigningCertificate = LoadCertificate(),
                       RequireSsl = true,


                    });

                });


            }

            X509Certificate2 LoadCertificate()
            {
                return new X509Certificate2(
                    string.Format(@"{0}\Certificates\idsrv3test.pfx", 
                    AppDomain.CurrentDomain.BaseDirectory), "idsrv3test");
            }
        }
    }

Конфигурация регистрации клиента на сервере

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using IdentityServer3.Core.Models;

    namespace IDServer.Config
    {
        public static class Clients
        {
            public static IEnumerable<Client> Get()
            {

                return new[]
                {
                    new Client
                    {
                        Enabled=true,
                        ClientName = "My Application",
                        ClientId = "MyApp",
                        Flow = Flows.Hybrid,
                        //Flow=Flows.Implicit,
                        RequireConsent = true,
                        RedirectUris = new List<string> { "https://localhost:44362/" },
                        AllowedScopes = new List<string> {"openid"}

                    }

                };
            }
        }
    }

Web App Config

 using Microsoft.Owin.Security;
 using Microsoft.Owin.Security.Cookies; 
 using Microsoft.Owin.Security.OpenIdConnect;
 using Owin;
 using System;
 using System.Diagnostics; 
 using System.Web; 
 using Microsoft.Owin.Host.SystemWeb;
 using Microsoft.Owin.Infrastructure;

 [assembly: OwinStartup(typeof(MyApp.Startup))]

 namespace MyApp {
     public partial class Startup
     {
         public void ConfigureAuth(IAppBuilder app)
         {
             app.UseKentorOwinCookieSaver();
             //app.UseKentorOwinCookieSaver(PipelineStage.Authenticate);




app.SetDefaultSignInAsAuthenticationTypeCookieAuthenticationDefaults
.AuthenticationType);

             ICookieManager c = new SystemWebCookieManager();


             app.UseCookieAuthentication(new CookieAuthenticationOptions
             {
                 AuthenticationType = "Cookies",
                 //CookieManager = new SystemWebChunkingCookieManager()
                 //CookieManager = new SystemWebCookieManager()
                 CookieManager = c
             });

             app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
             {

                 ClientId = "MyApp",
                 Authority = "https://localhost:44398/",
                 RedirectUri = "https://localhost:44362/",
                 SignInAsAuthenticationType = "Cookies",
                 ResponseType = "code id_token",
                 Scope = "openid",
                 RequireHttpsMetadata = true,
                 CallbackPath = new PathString("/home/contact/"),

                 Notifications = new OpenIdConnectAuthenticationNotifications()
                 {
                     MessageReceived = async n =>
                     {
                         Debug.Print(n.ProtocolMessage.IdToken);
                     }

                 }

         }
     }

1 Ответ

0 голосов
/ 07 мая 2018

Мне, наконец, удалось заставить его работать, установив AutheticationType в значение Active. Смотрите фрагмент ниже.

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = "Cookies",
    AuthenticationMode = AuthenticationMode.Active            
});
...