每次使用"不允许"时,使用ASP身份登录失败(即使"电子邮件"和"用户名"具有相同的值))

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这导致了问题。