ASP.Net Core 2.1 Vue.JS SPA - проверка подлинности файлов cookie и сервер разработки Vue.JS - PullRequest
0 голосов
/ 31 мая 2019

У меня есть приложение, которое по сути является Vue.JS SPA, которое находится в приложении dotnet core 2.1 и предоставляет API-сервисы.Когда я запускаю приложение с моей текущей конфигурацией Startup.cs, оно запускает 3 окна.Одно из этих окон является фактическим корневым каталогом приложения ASP.Net Core, а два других (не спрашивайте меня, почему 2) являются копиями сервера разработки Vue.js, которые вы получаете при выполнении npm run serve.

* 1003.* Проблема, с которой я столкнулся, заключается в том, что, хотя аутентификация работает нормально, если я использую экземпляр, запущенный в первом окне, если я пытаюсь войти в систему с помощью окон сервера Vue.JS, я просто получаю обратно 401.

Моя первая мысль была о CORS, поэтому я настроил политику CORS исключительно для работы в режиме разработки, но это не устранило проблему.Разработка без сервера Vue.JS на самом деле не жизнеспособна, так как без него у меня нет HMR, и мне нужно будет перезагружать все состояние приложения каждый раз, когда я изменяю дизайн.

У меня уже работала эта настройка сСерверная часть API .net Framework 4.6 не имеет никаких проблем, поэтому я могу только думать, что это современное улучшение безопасности, которое блокирует проксирование, которое мне нужно настроить, чтобы отключить его при разработке или что-то в этом роде.

Любые предложения о том, какЯ могу решить эту проблему.

Вот мой текущий файл Startup.cs Configure ...

       public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory,
        ApplicationDbContext context, RoleManager<IdentityRole> roleManager, UserManager<ApplicationUser> userManager)
    {
        if (env.IsDevelopment())
        {
            app
                .UseDeveloperExceptionPage()
                .UseDatabaseErrorPage()
                .UseCors("DevelopmentPolicy");
        }
        else
        {
            app
                .UseExceptionHandler("/Home/Error")
                .UseHsts();
        }

        app
            .UseAuthentication()
            .UseHttpsRedirection()
            .UseStaticFiles()
            .UseSpaStaticFiles();

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

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

            if (env.IsDevelopment())
            {
                spa.UseVueCliServer("serve");
            }
        });

        DbInitializer.Initialize(context, roleManager, userManager, env, loggerFactory);
    }

... и ConfigureServices ...

   public void ConfigureServices(IServiceCollection services)
    {
        services
            .AddLogging(builder => builder
                .AddConsole()
                .AddDebug());

        services
            .AddMvc()
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
                .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver());

        services
            .AddCors(options =>
            {
                options.AddPolicy("DevelopmentPolicy",
                    policy => policy.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod());
            });

        // In production, the Vue files will be served from this directory
        services.AddSpaStaticFiles(configuration => { configuration.RootPath = "wwwroot"; });
        services.AddAuthentication();

        services
            .ConfigureEntityFramework(Configuration)
            .ConfigureEntityServices()
            .ConfigureIdentityDependencies()
            .ConfigureDomainServices()
            .ConfigureApplicationCookie(config =>
            {
                config.SlidingExpiration = true;
                config.Events = new CookieAuthenticationEvents
                {
                    OnRedirectToLogin = cxt =>
                    {
                        cxt.Response.StatusCode = 401;
                        return Task.CompletedTask;
                    },
                    OnRedirectToAccessDenied = cxt =>
                    {
                        cxt.Response.StatusCode = 403;
                        return Task.CompletedTask;
                    },
                    OnRedirectToLogout = cxt => Task.CompletedTask
                };
            });
    }

.... и здесь идентичность объединяется с конфигурацией EF ...

       public static IServiceCollection ConfigureEntityFramework(this IServiceCollection services, string connectionString)
    {
        services
            .AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(connectionString))
            .AddIdentity<ApplicationUser, IdentityRole>(options =>
                {

                    // Password settings
                    options.Password.RequireDigit = true;
                    options.Password.RequiredLength = 8;
                    options.Password.RequireNonAlphanumeric = true;

                    // Lockout settings
                    options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);
                    options.Lockout.MaxFailedAccessAttempts = 10;

                    // User settings
                    options.User.RequireUniqueEmail = true;
                })
            .AddRoleManager<RoleManager<IdentityRole>>()
            .AddSignInManager<SignInManager<ApplicationUser>>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

        return services;
    }

Мой vue.config.js выглядит следующим образом ...

const baseUrl = ''

module.exports = {
    publicPath: baseUrl + '/',

    // place our built files into the parent project where they will be copied
    // into the distribution for deployment
    outputDir: '../wwwroot',

    filenameHashing: true, //process.env.NODE_ENV === 'production',
    lintOnSave: 'error',

    css: {
        modules: false,
        sourceMap: process.env.NODE_ENV !== 'production',
        loaderOptions: {
            sass: {
                data: `
                    $fa-font-path: ${process.env.NODE_ENV !== 'production' ? '"~/fonts"' : '"' + baseUrl + '/fonts"'};
                    @import "@/scss/base/index.scss";
                    @import "@/scss/helpers/index.scss";
                `
            }
        }
    },

    devServer: {
        host: 'localhost',
        port: 8080,
        hot: true,
        open: true,
        openPage: '',
        overlay: true,
        disableHostCheck: true,
        proxy: {
            // Proxy services to a backend API
            '/api': {
                target: process.env.PROXY || 'https://localhost:44368',
                secure: false,
                changeOrigin: true
            }
        }
    },

    // these node_modules use es6 so need transpiling for IE
    transpileDependencies: [
    ]
}

1 Ответ

0 голосов
/ 31 мая 2019

В конце концов, я решил эту проблему, настроив приложение так, чтобы оно вызывало HTTPS только в режиме разработки.HTTPS убивал основной сервер разработки Webpack и, следовательно, замену «горячего модуля» - теперь я могу успешно отлаживать в главном окне!

С удовольствием проголосую за лучшие решения, чем то, чтобы заставить его работать без уничтожения SSL (если это возможно).

...