ASP Net Core 3.1动态设置身份选项

问题描述

在我的应用程序中,我希望在用户管理员身份动态登录为true / false时设置“ RequireConfirmedAccount”选项,基本上在运行时激活/停用需求,而无需重新启动应用程序。

此外,可能希望能够动态更改“ ConfigureServices(IServiceCollection服务)”中配置的任何设置。

这可能吗?

public class Startup
    {
        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)
        {
            // add feature management control
            services.AddFeatureManagement();

            services.AddDbContext<ApplicationDbContext>(options =>
                options.UsesqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));

            services.AddIdentity<ApplicationUser,IdentityRole>(options =>
            {
                options.Password.requiredLength = 3;
                options.Password.requiredUniqueChars = 1;

                // **would like to turn this off or on dynamically**
                options.SignIn.RequireConfirmedAccount = false;

            })
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders(); token
        }
    }

更新

以下是我在评论中给出的链接

appsettings.json

{
"AllowedHosts": "*","AppSettings": {
    "RequireEmailConfirmation": "true"
  }
}

在Startup.cs中

public class Startup
    {
        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)
        {
            AppSettings appSettings = new AppSettings();
            Configuration.GetSection("AppSettings").Bind(appSettings);

             services.AddIdentity<ApplicationUser,IdentityRole>(options =>
        {
            options.Password.requiredLength = 3;
            options.Password.requiredUniqueChars = 1;

            options.SignIn.RequireConfirmedAccount = bool.Parse(Configuration["AppSettings:RequireEmailConfirmation"]);
        })
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

            ...........
            
            services.AddSingleton(sp => new AppSettingsWrapper(sp.GetService<IOptionsMonitor<AppSettings>>()));
        }

}

在AppSettings.cs

public class AppSettings
    {
        public string RequireEmailConfirmation { get; set; }
    }

在AppSettingsWrapper.cs

 public class AppSettingsWrapper 
    {
        private AppSettings _settings;

        public AppSettingsWrapper(IOptionsMonitor<AppSettings> settings)
        {
            _settings = settings.CurrentValue;

            settings.OnChange(Listener);
        }

        private void Listener(AppSettings settings)
        {
            _settings = settings;
        }

        // Example getter
        public string RequireEmailConfirmation => _settings.RequireEmailConfirmation;
    }

Switchviewmodel.cs类

public class Switchviewmodel
    {     
        public string SwitchName { get; set; }

        public string Value { get; set; }

        public bool IsSelected { get; set; }

    }
在SwitchBoardController.cs中的

(此控制器将从视图中的多个复选框接收一些值,从而在应用程序中打开或关闭某些设置。现在,视图中只有一个复选框可用于登录RequireEmailConfirmation。因此列表仅包含一项。)>

如何在此控制器中使用包装器类,如何注入它 和使用?

public class SwitchBoardController : Controller
    {
        private IConfiguration _config;      
        public SwitchBoardController(IConfiguration config)
        {
            _config = config;         
        }
        
        [HttpGet]
        public IActionResult Index()
        {

            var vm = new List<Switchviewmodel>();

            Switchviewmodel svm = new Switchviewmodel()
            {
                SwitchName = AppConstants.Constants.SWITCH_REQUIRE_EMAIL_CONFIRMATION,IsSelected = bool.Parse(_config["AppSettings:RequireEmailConfirmation"])
            };

            vm.Add(svm);

            return View(vm);
        }

        [HttpPost]
        public IActionResult Index(List<Switchviewmodel> vm)
        {
            foreach (Switchviewmodel item in vm)
            {
                if (item.SwitchName == AppConstants.Constants.SWITCH_REQUIRE_EMAIL_CONFIRMATION)
                {
                   
                    _config["AppSettings:RequireEmailConfirmation"] = ( item.IsSelected ? "true" : "false");
                }
            }

            return View(vm);
        }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)