У меня есть веб-приложение 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>