问题描述
在我的应用程序中,我希望在用户以管理员身份动态登录为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 (将#修改为@)