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