Asp. net core: хостинг MVC и SPA с одинаковой аутентификацией Identity. Клиент выходит из системы при перенаправлении на MVC часть приложения - PullRequest
0 голосов
/ 06 августа 2020

Я использую по умолчанию asp. net core + angular scaffold с идентификатором для размещения моего SPA внутри приложения MVC, часть аутентификации работает так, как должна, внутри angular SPA.

В моем startup.cs нет ничего особенного, стандартный. net основной материал для скаффолда:

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DbName")));

            services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
                .AddEntityFrameworkStores<ApplicationDbContext>();

            services.AddIdentityServer()
                .AddApiAuthorization<ApplicationUser, ApplicationDbContext>();

            services.AddAuthentication()
                .AddIdentityServerJwt();
            services.AddControllersWithViews().AddRazorRuntimeCompilation();
            services.AddRazorPages();
            services.AddHttpContextAccessor();
            // In production, the Angular files will be served from this directory
            services.AddSpaStaticFiles(configuration =>
            {
                configuration.RootPath = "ClientApp/dist";
            });
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {

            if (env.IsDevelopment())
            {
                app.UseBrowserLink();
                app.UseDeveloperExceptionPage();
                app.UseDatabaseErrorPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            if (!env.IsDevelopment())
            {
                app.UseSpaStaticFiles();
            }

            app.UseRouting();

            app.UseAuthentication();
            app.UseIdentityServer();
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller}/{action=Index}/{id?}");
                endpoints.MapRazorPages();
            });

            app.UseSpa(spa =>
            {
                spa.Options.SourcePath = "ClientApp";

                if (env.IsDevelopment())
                {
                    spa.UseProxyToSpaDevelopmentServer("http://localhost:4200");
                }
            });
        }
    }

Я также обслуживаю бритвенные представления через net основные контроллеры для другой части приложения , однако шаблонная аутентификация здесь вообще не работает.

Вот что происходит в настоящее время:

  1. Go по адресу, защищенный angular охрана маршрутизатора перенаправляет меня на шаблонный вход page.
  2. Я вхожу в систему и перенаправляюсь в SPA. '

Когда я «пересекаю путь» из SPA, возникает проблема:

I go to: http://myadress/mycontroller/MyAction) Я выхожу из приложения и, используя простой контроллер с UserManager<ApplicationUser>, проверяю, существует ли HttpContext.User:
        public IActionResult MyAction()
        {
            //user cannot be found here.
            var user = _userManager.GetUserAsync(HttpContext.User);
            
            return View();
        }

Я попытался поставить [Authorize], думая, что перенаправление на страницу входа снова должно помочь мне войти в «часть Mvc» приложения. (поскольку ранее я вошел в систему с URL-адресом перенаправления в SPA), но безуспешно: я получаю 401. При посещении без дополнительной информации.

Желаемый результат, который у меня есть со всей этой катастрофой, следующий:

  • 2 части приложения, размещенного в asp. net ядре; 1 - ваше стандартное приложение MVC с видами бритвы (только администратор), а другое - SPA в angular для клиентов (только клиент).
  • как только пользователь входит в систему, он / она перенаправляется на основе role - правая часть приложения, поэтому / dashboard для администраторов (MVC) и / app для клиентов (angular)

Это в основном все, я не думаю, что это должно быть так сложно но я новичок в asp. net core.

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

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