Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.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

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
C# 如何防止在ASP.NETCore中注册后自动登录?_C#_Asp.net Core - Fatal编程技术网

C# 如何防止在ASP.NETCore中注册后自动登录?

C# 如何防止在ASP.NETCore中注册后自动登录?,c#,asp.net-core,C#,Asp.net Core,我使用的是ASP.NET Core 2.1.519及其版本。 此库的默认行为是在注册后自动登录用户。我想删除此行为,因为在电子邮件确认之前我不允许登录 到目前为止,我能够在允许使用服务配置进行“手动”登录之前强制电子邮件确认: services.AddDefaultIdentity<IdentityUser>(opt => { opt.Password.RequiredLength = 6; opt.Passwor

我使用的是ASP.NET Core 2.1.519及其版本。 此库的默认行为是在注册后自动登录用户。我想删除此行为,因为在电子邮件确认之前我不允许登录

到目前为止,我能够在允许使用服务配置进行“手动”登录之前强制电子邮件确认:

services.AddDefaultIdentity<IdentityUser>(opt =>
        {
            opt.Password.RequiredLength = 6;
            opt.Password.RequireDigit = false;
            opt.Password.RequireNonAlphanumeric = false;
            opt.Password.RequireUppercase = false;
            opt.Password.RequireLowercase = false;
            opt.SignIn.RequireConfirmedEmail = true; //This did the trick
        }).AddEntityFrameworkStores<ApplicationDbContext>();
services.AddDefaultIdentity(opt=>
{
opt.Password.RequiredLength=6;
opt.Password.RequireDigit=false;
opt.Password.RequireNonAlphanumeric=false;
opt.Password.RequireUppercase=false;
opt.Password.RequireLowercase=false;
opt.SignIn.RequireConfirmedEmail=true;//这就成功了
}).AddEntityFrameworkStores();
但注册功能触发的自动登录似乎绕过了这一规则

解决这个问题的一个可能方法是从这个库继承和覆盖注册行为,我想知道是否有一些内置配置(如上面显示的RequireConfirmedEmail)来实现这一点。到目前为止,我还没有发现类似的

非常感谢您的时间和帮助。

编辑

正如Tieson在有问题的评论中所建议的那样,这种行为似乎已在以后的.NET核心版本中得到纠正。正如我在问题中所说,我使用的是版本2.1.519,而当前的稳定版本是2020-11-10发布的版本3.1.10。如果您想避免我最初的答案所要求的所有代码开销,那么最好更新您的.NET核心版本


原始答案

实际上,可以通过重写来修改标识库的代码。解释了如何做到这一点

基本上,您可以构建要覆盖的库代码。Visual Studio提供了执行此操作的适当方法:

Right click your project -> Add -> New Scaffolded Item -> Identity
它还帮助您选择要覆盖的功能: 在这种情况下,请选择Account/Register

这将在您的Areas文件夹中生成该功能所需的所有代码。然后,您所要做的就是转到Areas/Identity/Pages/Account/Register.cshtml.cs并修改OnPostAsync方法,在发送电子邮件后删除登录行

瞧,任务完成了。但是,你得到了很多你不想要的文件和代码,只是为了删除一小行

我仍然希望对此有一个内置配置。

编辑

正如Tieson在有问题的评论中所建议的那样,这种行为似乎已在以后的.NET核心版本中得到纠正。正如我在问题中所说,我使用的是版本2.1.519,而当前的稳定版本是2020-11-10发布的版本3.1.10。如果您想避免我最初的答案所要求的所有代码开销,那么最好更新您的.NET核心版本


原始答案

实际上,可以通过重写来修改标识库的代码。解释了如何做到这一点

基本上,您可以构建要覆盖的库代码。Visual Studio提供了执行此操作的适当方法:

Right click your project -> Add -> New Scaffolded Item -> Identity
它还帮助您选择要覆盖的功能: 在这种情况下,请选择Account/Register

这将在您的Areas文件夹中生成该功能所需的所有代码。然后,您所要做的就是转到Areas/Identity/Pages/Account/Register.cshtml.cs并修改OnPostAsync方法,在发送电子邮件后删除登录行

瞧,任务完成了。但是,你得到了很多你不想要的文件和代码,只是为了删除一小行

我仍然希望有一个内置的配置

我仍然希望有一个内置的配置

如果将其与ASP.NET Core 3+中的内置代码
RegisterModel
类进行比较,您会发现它可以根据的配置值确定用户注册后是否自动登录,如下所示

if (_userManager.Options.SignIn.RequireConfirmedAccount)
{
    return RedirectToPage("RegisterConfirmation", new { email = Input.Email, returnUrl = returnUrl });
}
else
{
    await _signInManager.SignInAsync(user, isPersistent: false);
    return LocalRedirect(returnUrl);
}
通过检查
RequireConfirmedEmail
选项的配置值,您可以在ASP.NET Core 2.1项目中实现同样的功能

if (!_userManager.Options.SignIn.RequireConfirmedEmail)
{
    await _signInManager.SignInAsync(user, isPersistent: false);
}

return LocalRedirect(returnUrl);
我仍然希望有一个内置的配置

如果将其与ASP.NET Core 3+中的内置代码
RegisterModel
类进行比较,您会发现它可以根据的配置值确定用户注册后是否自动登录,如下所示

if (_userManager.Options.SignIn.RequireConfirmedAccount)
{
    return RedirectToPage("RegisterConfirmation", new { email = Input.Email, returnUrl = returnUrl });
}
else
{
    await _signInManager.SignInAsync(user, isPersistent: false);
    return LocalRedirect(returnUrl);
}
通过检查
RequireConfirmedEmail
选项的配置值,您可以在ASP.NET Core 2.1项目中实现同样的功能

if (!_userManager.Options.SignIn.RequireConfirmedEmail)
{
    await _signInManager.SignInAsync(user, isPersistent: false);
}

return LocalRedirect(returnUrl);

我不完全确定你指的是什么。有一个项目模板可以为您构建大量代码——之后,您可以编辑不需要的内容。例如,在中,您可以简单地删除
await\u-signInManager.SignInAsync(user,isPersistent:false)。嗨,蒂伦!谢谢你的回答!事实上,我已经尝试过了,并且取得了成功,我刚刚发布了一个答案,解释了如何做到这一点。但是,正如我在回答中所说的,我希望有一个内置的配置来实现这一点,因为重写意味着有很多脚手架代码,只删除一行:(无论如何,还是要谢谢你!我没有使用大多数身份框架的主要原因是,框架代码的开销——它的大部分功能都可以用更少的代码以定制的方式完成。理论上,根据文档,你使用的设置已经被认为是为了防止未经确认的电子邮件登录——可能只需要确保你已经使用了无论您运行的是哪个版本的.NET,它都是最新的版本。我认为您是对的,Tieson,当前的行为似乎是错误的,并且可能在以后的版本中得到了修复。我使用的是ASP.NET Core 2.1.519,当前的稳定版本似乎是2020-11-10发布的.NET Core 3.1.10。这就解释了为什么doc说它已经内置了。谢谢你的帮助!我不完全确定你指的是什么。有一个项目模板