Rho*_*age 8 c# asp.net asp.net-mvc .net-core asp.net-core
注册用户工作正常,因为它通过以下行登录:
await _signInManager.SignInAsync(user, isPersistent: model.RememberMe);
Run Code Online (Sandbox Code Playgroud)
但是如果我想再次使用同一个用户登录则不起作用(任务结果总是返回"Not Allowed").
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: true);
Run Code Online (Sandbox Code Playgroud)
我确实知道PasswordSignInAsync需要一个USERNAME,而不是一个EMAIL - 但它们对我的应用程序是一样的.
我已经尝试了登录方法的每个变体,包括检查用户和密码是否正确(这些都是成功的),传入用户对象,更改ViewModel属性名称等.
什么需要改变的想法?
类似的上下文问题:ASP.NET身份提供程序SignInManager保持返回失败
谢谢.
Rho*_*age 23
好的,我明白了.我在这里查看了源代码 - https://github.com/aspnet/Identity/blob/dev/src/Identity/SignInManager.cs.
NotAllowed仅在此处设置:
protected virtual async Task<SignInResult> PreSignInCheck(TUser user)
{
if (!await CanSignInAsync(user))
{
return SignInResult.NotAllowed;
}
if (await IsLockedOut(user))
{
return await LockedOut(user);
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
所以我钻进了CanSignInAsync ......
public virtual async Task<bool> CanSignInAsync(TUser user)
{
if (Options.SignIn.RequireConfirmedEmail && !(await UserManager.IsEmailConfirmedAsync(user)))
{
Logger.LogWarning(0, "User {userId} cannot sign in without a confirmed email.", await UserManager.GetUserIdAsync(user));
return false;
}
if (Options.SignIn.RequireConfirmedPhoneNumber && !(await UserManager.IsPhoneNumberConfirmedAsync(user)))
{
Logger.LogWarning(1, "User {userId} cannot sign in without a confirmed phone number.", await UserManager.GetUserIdAsync(user));
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
哦,我知道这是怎么回事.我们来看看我的Startup.cs配置.
services.Configure<IdentityOptions>(options =>
{
...
options.SignIn.RequireConfirmedEmail = true;
...
}
Run Code Online (Sandbox Code Playgroud)
亲爱的,好的.
我所要做的就是弹出数据库并将我的用户设置为EmailConfirmed = true.PEBCAK.
"不允许"是有道理的,但没有任何错误消息随之回来 - 所以这不是知道发生了什么的最佳方式.幸运的是.NET Core很容易深入到源代码中.
希望这有助于某人.
小智 5
如果您尚未添加电子邮件确认,请检查您的 Startup.cs 配置。
services.Configure<IdentityOptions>(options =>
{
//...
options.SignIn.RequireConfirmedEmail = false;
//...
}
Run Code Online (Sandbox Code Playgroud)
应该是false这导致了问题。
| 归档时间: |
|
| 查看次数: |
2853 次 |
| 最近记录: |