Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core ASP.Net核心3.1。动态设置标识选项_Asp.net Core_.net Core_Identity - Fatal编程技术网

Asp.net core ASP.Net核心3.1。动态设置标识选项

Asp.net core ASP.Net核心3.1。动态设置标识选项,asp.net-core,.net-core,identity,Asp.net Core,.net Core,Identity,在我的应用程序中,我想在用户以管理员身份动态登录到true/false时设置“RequireConfirmedAccount”选项,基本上在运行时激活/停用需求,而无需重新启动应用程序 此外,您可能希望能够动态更改“ConfigureServices(IServiceCollection services)”中配置的任何设置 这可能吗 public class Startup { public Startup(IConfiguration configuration)

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

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

这可能吗

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
        }
    }
在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>>()));
        }

}
在appsetingswrapper.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;
    }
在SwitchBoardController.cs中 (此控制器将从视图的多个复选框中接收一些值,从而打开或关闭应用程序中的某些设置。目前,视图中只有一个复选框用于RequireMailConfirmation登录。因此,列表仅包含一项。)

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

公共类交换机控制器:控制器
{
私有IConfiguration\u config;
公用配电盘控制器(IConfiguration配置)
{
_config=config;
}
[HttpGet]
公共IActionResult索引()
{
var vm=新列表();
SwitchViewModel svm=新的SwitchViewModel()
{
SwitchName=AppConstants.Constants.SWITCH\u需要\u电子邮件\u确认,
IsSelected=bool.Parse(_config[“AppSettings:RequireEmailConfirmation”])
};
添加(svm);
返回视图(vm);
}
[HttpPost]
公共IActionResult索引(列表vm)
{
foreach(vm中的SwitchViewModel项)
{
if(item.SwitchName==AppConstants.Constants.SWITCH\u需要\u电子邮件\u确认)
{
_配置[“AppSettings:RequireEmailConfirmation”]=(item.IsSelected?“true”:“false”);
}
}
返回视图(vm);
}
}

这可能会有所帮助:@ChristophLütjen是的,的确如此!我成功了,非常感谢。@ChristophLütjen事实上我可以发誓它成功了,但后来再试一次,它似乎真的不起作用。。。我正在更新我的问题。但我确信这是正确的路径,只是我认为没有在控制器中正确使用该包装器类。在您的情况下,简单的解决方案应该可以很好地工作:使用IOptionsSnapshot链接的帖子包含这两种解决方案,即标准解决方案和您需要的“特殊包装器”解决方案(并且仅当)您希望在singleton服务中使用您的选项。控制器不是单例的。
public class AppSettings
    {
        public string RequireEmailConfirmation { get; set; }
    }
 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;
    }
public class SwitchViewModel
    {     
        public string SwitchName { get; set; }

        public string Value { get; set; }

        public bool IsSelected { get; set; }

    }
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);
        }
}