【问题标题】:Using Dependency Injection to Configure CookieAuthenticationOptions in AspNetCore Mvc在 AspNetCore Mvc 中使用依赖注入配置 CookieAuthenticationOptions
【发布时间】:2020-09-14 21:39:26
【问题描述】:

有没有办法使用依赖注入来配置 cookie 身份验证选项?我想从数据库中获取一些设置,但此时我无法访问 DatabaseContext。

public void ConfigureServices(IServiceCollection services)
{
  ...
  services
            .AddAuthentication(Authentication.scheme)
            .AddCookie(Authentication.scheme, options =>
            {
                options.ExpireTimeSpan = new TimeSpan(30, 0, 0, 0, 0);
                options.Cookie.IsEssential = true;
                options.Cookie.Name = ".AUTH-Cookie";
                options.ReturnUrlParameter = "returnUrl";
                options.LoginPath = "/Security/SignIn";
                options.LogoutPath = "/Security/SignOut";
                options.EventsType = typeof(CookieAuthenticationEvents);
            });
  ...
}

我可以使用 AddOptions() 和 Configure() 来处理 ConfigureServices 中的其他项目,但我不知道如何使用 CookieAuthenticationOptions...

services
  .AddOptions<MvcOptions>()
  .Configure<IDisplayMetadataProvider>((options, localizationMetadataProvider) =>
  {
    options.ModelMetadataDetailsProviders.Add(localizationMetadataProvider);
  });

我尝试用 CookieAuthenticationOptions 做同样的事情,但它的工作方式似乎不同......

【问题讨论】:

    标签: asp.net-mvc asp.net-core dependency-injection


    【解决方案1】:

    关于如何在cookie身份验证选项中从数据库中获取数据,这里有一个简单的示例:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<MyDbContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("YourConnnectionString")));
    
        var sp = services.BuildServiceProvider();
        var myDbContext = sp.GetService<MyDbContext>();
        var data = GetData(myDbContext);
    
        services.AddAuthentication(Authentication.scheme)
        .AddCookie(Authentication.scheme,options =>
        {
            options.LoginPath = data;
            //...
        });         
    }
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {        
        //be sure you have added authentication middleware
        app.UseAuthentication();
    
        //if you use asp.net core 3.x,also need to add this
        //app.UseAuthorization();
    
    }
    public static string GetData(MyDbContext _context)
    {
        //get the data from database
        var data = _context.Tables.Select(j => j.Loginpath).FirstOrDefault();
        return data;
    }
    

    【讨论】:

    • 多次构建服务提供者是否可以接受?
    • 无需多次构建服务提供者,只需多次使用 sp.GetService() 即可获得您的服务。如果我的回答对您有帮助,您能接受吗?
    • 我最终直接查询数据库,而不是使用服务中的 DatabaseContext,但由于您的答案是可行的、实用的路线,我会接受它作为答案。我仍然希望有一种方法可以像使用 AddOptions 一样使用 DI,但似乎不可能。感谢您的帮助!
    猜你喜欢
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多