现在花了很多时间但无济于事,我希望用户能够灵活地从应用程序内配置 CookieAuthenticationOptions。给出的大多数示例仅在启动时设置配置服务中的选项,但鉴于选项是硬编码的,这无用。
我面临的挑战是找到一个解决方案,允许在使用内置身份功能时配置这些选项,如果应用程序使用没有身份的 cookie 身份验证,那么它可能更容易弄清楚。
两个主要目标:
- 在启动时从 DB 表加载 CookieAuthenticationOptions。
- 如果在应用程序的生命周期内更改/更新设置,则需要使已经存在问题的 cookie 失效/强制在下一页请求中重新创建,以便 cookie 现在具有更新的参数。
到目前为止,我的理论对错是在下面的configure方法中加载选项,但是在唱歌时,我检查了chrome调试器,发现cookie名称之类的选项没有设置,假设应用程序只是使用默认值内置选项。那么我怎样才能实现上述目标呢?请注意,我在大多数应用程序中使用剃须刀页面和页面模型,还使用 MS 用户帐户模板中的内置身份系统。谢谢
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IOptions<IdentityOptions> identityOptions, IOptions<CookiePolicyOptions> cookiePolicyOptions, IOptions<CookieAuthenticationOptions> cookieOptions)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
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.UseHttpsRedirection();
app.UseStaticFiles();
// Added to original .net core template.
// Whenever a request is made for a page, serilog is going to log that.
app.UseSerilogRequestLogging();
app.UseRouting();
// Here I am creating a service to access the DB table and pull the options, this does work for other settings in the DB table which i have not included in this example given the focus of the topic is cookies.
using (var scope = app.ApplicationServices.CreateScope())
{
var systemSettings = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>().SystemSetting.FirstOrDefault();
if (systemSettings != null)
{
// Cookie Options
cookieOptions.Value.Cookie.Name = systemSettings.CookieName;
cookieOptions.Value.LoginPath = systemSettings.LoginPath;
// I will add the other parameters once I got the above two working...
}
}
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapHub<DataHub>("/dataHub");
endpoints.MapControllers(); // Added for use with REST API.
});
}
MS模板登录页面模型使用标准登录方法:
var result = await _signInManager.PasswordSignInAsync(Input.UserName, Input.Password, Input.RememberMe, lockoutOnFailure: true);