Я пытаюсь развернуть свое приложение на нашем внутреннем сервере с Nginx. Это ASP. NET Core 2.2 Razor Pages. Меня попросили включить некоторую аутентификацию для целей регистрации. В конце концов все работало нормально на моем компьютере. Я использовал этот сайт для добавления аутентификации на основе cook ie: https://www.mikesdotnetting.com/article/335/simple-authentication-in-razor-pages-without-a-database
Я сделал несколько модификаций для обработки еще нескольких пользователей в рамках метода OnPost()
. Хотя я не думаю, что это было бы проблемой.
Возможно, важно упомянуть, что это не единственное. net основное приложение, работающее на сервере. Настройка аналогична следующей:
app1: our.domain.com
app2: our.domain.com/app2 (с этим у меня проблемы)
все работает правильно, кроме входа в систему. Когда я пытаюсь войти в систему, если пароль и имя пользователя введены правильно, он перенаправляется на соответствующую страницу, однако создается впечатление, что идентификатора нет или он не может найти его впоследствии.
При первой попытке я обнаружил следующую ошибку в журнале службы kestrel:
fail: Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery[7]
Я могу сделать так, чтобы это исчезло с помощью services.AddDataProtection()
, но проблема остается той же, Я получаю перенаправление - или получаю сообщение об ошибке, если попытка входа неверна - но все равно не могу получить доступ к авторизованной папке и, например, HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.GivenName)?.Value
возвращает пустое или пустое значение.
Я сделал быструю проверку и добавил та же страница входа в систему и авторизованная папка, и другие зависимости от другого приложения. И там это работает. Я даже не включил services.AddDataProtection()
в файл startup.cs. Логин работает отлично. Хотя он использует. net core 2.1.
Так что, возможно, придется что-то делать с рутированием? Или я не знаю. Я полностью потерян. Я не полностью занятый разработчик, больше как любитель, и я полностью застрял в этот момент. Может я что-то напутал в файле startup.cs? Или я должен добавить что-то еще? Или это что-то с обработкой файлов cookie? Я действительно много искал, пока не повезло.
Вот соответствующая часть моего startup.cs:
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.AddEntityFrameworkNpgsql()
.AddDbContext<Models.UserAccessDbContext>(options =>
options.UseNpgsql(Configuration.GetConnectionString("appConnection")))
.BuildServiceProvider();
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
// https://hanselman.com/blog/DealingWithApplicationBaseURLsAndRazorLinkGenerationWhileHostingASPNETWebAppsBehindReverseProxies.aspx
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.All;
options.AllowedHosts = Configuration.GetValue<string>("AllowedHosts")?.Split(';').ToList<string>();
});
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(cookieOptions =>
{
cookieOptions.LoginPath = "/";
});
services.AddMvc().AddRazorPagesOptions(options =>
{
options.Conventions.AuthorizeFolder("/admin");
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddDataProtection()
.SetApplicationName("app")
.PersistKeysToFileSystem(new DirectoryInfo(@"/var/dpkeys/"));
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
app.Use((context, next) =>
{
context.Request.PathBase = new PathString("/app");
return next.Invoke();
});
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseMvc();
}
Обновление: одна маленькая деталь. Повар ie создан, и я вижу его в инспекторе Chrome. Но сайт / приложение не видит меня как аутентифицированного пользователя.