Идентификация с ASP. Net Core 3.1 - при отсутствии аутентификации приложение не перенаправляет на вход в производственной среде, как в dev - PullRequest
1 голос
/ 05 августа 2020

У меня есть веб-приложение ASP. Net Core (3.1), которое использует преимущества Identity. Он работает, как и нужно, на моем устройстве разработчика, но не перенаправляет на вход в производство.

Позвольте мне объяснить. У меня есть домашняя / целевая страница со ссылками на действия по всему ней. Если пользователь щелкает действие, требующее аутентификации (я использую тег [Authorize], чтобы указать это в моем контроллере), тогда приложение должно перенаправить на страницу входа, чтобы позволить пользователю сначала войти в систему, а затем перенаправить на желаемое действие. что они щелкают. Это работает как magi c почти полностью из коробки с Identity на моей машине разработчика . Когда я отправляю sh в производство, это не работает. Он просто находится на домашней странице с URL-адресом, измененным на URL-адрес действия, по которому щелкнули действие, что нормально, я думаю - по крайней мере, он все еще обеспечивает проверку подлинности, - но мне нужно перенаправление.

Моя производственная машина сервер redhat linux с настройкой apache и .netcore 3.1 на нем.

Вот мой запуск:

public class Startup
{
    //private readonly IConfiguration _configuration;

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

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDistributedMemoryCache();

        services.AddControllersWithViews();
        services.AddRazorPages();

        services.AddDbContext<AAPDbContext>(options => {
            options.UseSqlServer(Configuration.GetConnectionString("AAP"));
        });
        services.AddDbContext<AuthDbContext>(options => {
            options.UseSqlServer(Configuration.GetConnectionString("AAP"));
        });

        services.AddTransient<IEmailSender, EmailSender>();
        services.Configure<AuthMessageSenderOptions>(Configuration);            
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");                
            app.UseHsts();
        }
        app.UseHttpsRedirection();
        app.UseStaticFiles();

        

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

Вот мой IdentityHostingStartup (добавлен Scaffolding, а затем настроен) :

public class IdentityHostingStartup : IHostingStartup
{
    public void Configure(IWebHostBuilder builder)
    {
        builder.ConfigureServices((context, services) => {
            services.AddDbContext<AuthDbContext>(options =>
                options.UseSqlServer(
                    context.Configuration.GetConnectionString("AAP")));

            services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
                .AddRoles<ApplicationRole>()
                .AddRoleManager<RoleManager<ApplicationRole>>()
                .AddEntityFrameworkStores<AuthDbContext>();                

            services.ConfigureApplicationCookie(options =>
            {
                options.LoginPath = $"/Identity/Account/Login";
                options.LogoutPath = $"/Identity/Account/Logout";
                options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
            });
        });
    }
}

Я надеюсь, что это странная ситуация, когда необходимо изменить некоторые настройки в поле linux, которое отличается b / c мой ящик разработчика - это машина Win10.

Вот мой файл конфигурации для Apache:

<VirtualHost *:*>
    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
</VirtualHost>

<VirtualHost *:80>
    ServerName blah blah
    RewriteEngine on

    RewriteRule .* https://blahblahblah [R=302,QSA,L]
</VirtualHost>
<VirtualHost *:443>
    ServerName blah blah

    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:5000/
    ProxyPassReverse / http://127.0.0.1:5000/

    SSLEngine on
    SSLCertificateFile /etc/pki/tls/certs/localhost.crt
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
    SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt
</VirtualHost>

Ответы [ 2 ]

0 голосов
/ 16 августа 2020

Я понял это. Это был файл конфигурации на сервере.

Я установил для него значение:

<VirtualHost *:*>
    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
</VirtualHost>

<VirtualHost *:80>
    ServerName <removed server name>
    RewriteEngine on

    RewriteRule .* https://<removed server name> [R=302,QSA,L]
</VirtualHost>
<VirtualHost *:443>
    ServerName <removed server name>

    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:5000/
    ProxyPassReverse / http://127.0.0.1:5000/

    SSLEngine on
    SSLCertificateFile /etc/pki/tls/certs/localhost.crt
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
    SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt
</VirtualHost>

... и должно было быть:

<VirtualHost *:*>
    RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
</VirtualHost>

<VirtualHost *:80>
    RewriteEngine On
    RewriteCond %{HTTPS} !=on
    RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
</VirtualHost>

<VirtualHost *:443>
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:5000/
    ProxyPassReverse / http://127.0.0.1:5000/
    ErrorLog /var/log/httpd/<removedappname>-error.log
    CustomLog /var/log/httpd/<removedappname>-access.log common
    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:!RC4+RSA:+HIGH:+MEDIUM:!LOW:!RC4
    SSLCertificateFile /etc/pki/tls/certs/localhost.crt
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
    SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt
</VirtualHost>

.. который я нашел здесь: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-apache?view=aspnetcore-3.1

Мораль истории: никогда не доверяйте официанту, когда он гадает так же, как вы. Всегда следуйте документации.

0 голосов
/ 05 августа 2020

В зависимости от поведения, которое вы описываете, вероятно, что что-то на вашем сервере обрабатывает неавторизованный запрос до того, как он попадет в ваше веб-приложение.

...