先看一下失败的情况吧:
这是我用自己的邮件注册的一个用户,注册是成功的,数据库中也有这条记录
但是大家看到EmailConfirmed字段的值为0,说明这个邮箱并没有经过验证。一般来说,如果是用邮箱进行注册,系统会发送一条验证邮件到你的邮箱。但是这里我没有验证这个邮箱。
其实问题就出在了这个字段了,那解决的办法就是让Identity在登录的时候不去验证这个邮箱,代码如下:
services.Configure<IdentityOptions>(options =>
{
// Password settings.密码配置
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Password.RequireUppercase = true;
options.Password.RequiredLength = 6;
options.Password.RequiredUniqueChars = 1;
//设置登录时是否需要经过验证的邮箱
options.SignIn.RequireConfirmedAccount = false;
// Lockout settings.锁定设置
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;
});
设置的属性是:options.SignIn.RequireConfirmedAccount。设置完后重新登录,发现登录成功了。
我们也可以从ASP.NET CORE的源码中找到答案(需要先下载ASP.NET CORE3.1的源码)。我们登录使用的函数是SignInManager类中的PasswordSignInAsync函数,
源码位置:aspnetcore\src\Identity,打开Identity.sln解决方案,找到src\Microsoft.AspNetCore.Identiy\SignInManager.cs文件。找到PasswordSignInAsync函数后,一步一步转到
子函数的定义后,找到CanSignInAsync函数,函数代码截图如下:
刚才的设置是在这里判断的,这里的日志输出也可以在ASP.NET CORE的控制台看到: