1

现在花了很多时间但无济于事,我希望用户能够灵活地从应用程序内配置 CookieAuthenticationOptions。给出的大多数示例仅在启动时设置配置服务中的选项,但鉴于选项是硬编码的,这无用。

我面临的挑战是找到一个解决方案,允许在使用内置身份功能时配置这些选项,如果应用程序使用没有身份的 cookie 身份验证,那么它可能更容易弄清楚。

两个主要目标:

  1. 在启动时从 DB 表加载 CookieAuthenticationOptions。
  2. 如果在应用程序的生命周期内更改/更新设置,则需要使已经存在问题的 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);
4

1 回答 1

0

不确定我们是否有不同的项目类型或 .NET Core 版本,但您是否已将您的应用配置为使用 ConfigureServices 方法中的 cookie?

services.ConfigureApplicationCookie(opt =>
{
    opt.Cookie.Name = systemSettings.CookieName,
    opt.LoginPath = systemSettings.LoginPath
});
于 2020-01-17T00:02:58.270 回答