programing

ASP.NET ID 제공자 SignInManager에서 오류가 계속 반환됨

jooyons 2023. 9. 2. 08:21
반응형

ASP.NET ID 제공자 SignInManager에서 오류가 계속 반환됨

MVC5용 표준 ASP Identity 공급자와 문제가 있습니다.메소드에 로그인하는 즉시:

await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);

계속 실패를 반환합니다.그래서 저는 디버깅을 시작했습니다.

UserManager.FindByEmail(model.Email);

로그인을 시도하는 사용자에게 유효한 사용자 ID를 반환합니다.그 다음에 사용했습니다.

SignInManager.UserManager.CheckPassword(UserIDObtainedFromFind, model.Password);

그러면 true가 반환됩니다. 즉, 제공한 암호가 유효합니다.

Sign In failure

추적할 수 있는 방법, 로그인 관리자 디버깅에 대한 모든 아이디어.PasswordSignInAsync 메서드에서 실패한 위치를 확인하시겠습니까?

로그인 관리자.PasswordSignIn은 사용자 이름에서 벗어나 사용자 이름이 전달하는 전자 메일과 동일한지 다시 확인해야 합니다.

한다면username != email:

ApplicationUser signedUser = UserManager.FindByEmail(model.Email);
var result = await SignInManager.PasswordSignInAsync(signedUser.UserName, model.Password, model.RememberMe, shouldLockout: false);

저의 경우 이메일과 비밀번호를 확인하는 동일한 시도에서 이메일은 제 사용자와 동일합니다.

    var userDO = _userManager.FindByEmailAsync(Input.Email).Result;
    var validatr = _userManager.CheckPasswordAsync(userDO, Input.Password);

이메일 = userName

참된 결과

그리고 데이터베이스를 확인해보니 작동하지 않는 사용자의 확인란이 거짓입니다.

enter image description here

그런 다음 시작 시 검증 매개 변수의 유효성을 검사해야 합니다.그것은 Startup.cs 안에 있습니다.

public void ConfigureServices(ServiceCollection services)
{
//......
            services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = false)
                .AddRoles<IdentityRole>()
                .AddEntityFrameworkStores<ApplicationDbContext>();
//......
}

enter image description here

위의 속성 설정 로그인하기 위해 확인된 IUserConfirmation 계정이 필요한지 여부를 나타내는 플래그를 가져오거나 설정합니다.

options.SignIn.RequireConfirmedEmail = false;
options.SignIn.RequireConfirmedPhoneNumber = false;

잘 가요

시작 시 확인:

options.SignIn.RequireConfirmedEmail = false;
options.SignIn.RequireConfirmedPhoneNumber = false;

이 값이 참으로 설정된 경우 로그인하기 전에 전자 메일 또는 전화 번호를 확인해야 합니다.

저는 SQL Profiler를 사용하여 PasswordSignInAsync가 호출하는 쿼리를 확인하는 것이 유용하다고 생각했습니다.저의 경우 - 판별기가 "사용자 컨텍스트"로 설정된 사용자를 찾으려 한다는 것을 알게 되었습니다.물론 제가 ASP에서 업그레이드했기 때문에 이것은 제게 효과가 없었습니다.NET Membership Services 및 이 식별자가 사용자로 설정되었습니다.새 코드가 Entity Framework를 사용하기 때문에 이 값은 사용자에 대해 사용하는 클래스에서 파생된 것으로 나타납니다.빠른 업데이트 문이 문제를 해결했습니다.

UPDATE AspNetUsers SET Discriminator = 'UserContext' WHERE Discriminator = 'User'

나를 위한 일

ApplicationUser signedUser = UserManager.FindByEmail(model.Email);
var result = await SignInManager.PasswordSignInAsync(signedUser.UserName, model.Password, model.RememberMe, shouldLockout: false);
ApplicationUser signedUser = UserManager.FindByEmail(model.Email);
var result = await SignInManager.PasswordSignInAsync(signedUser.UserName, 
model.Password, model.RememberMe, shouldLockout: false);

제 사용자 이름이 제 이메일과 동일하지 않기 때문에 이것은 저에게 효과가 있었습니다.이메일과 사용자 이름이 같아야 합니다.

지금은 좀 늙었지만, 이 문제에 대한 저의 생각은 이렇습니다.

Identity 데이터베이스(역할 및 관리자 계정)에 표준 항목이 있는지 확인하기 위해 유틸리티에서 정적 데이터를 생성하고 있었습니다.

엔티티를 만들고 컨텍스트와 직접 대화하여 누락된 역할이나 사용자를 만들었습니다.제가 가지고 있던 문제는 제가 설정하지 않았다는 것입니다.NormalizedUserName그리고.NormalizedEmail난 그냥 설정하고 있었어요.Email그리고.UserName.

(EF Core 2.x와 함께) 사용하는 최종 코드는 다음과 같습니다.

        if (!_context.Users.Any(_ => _.Id.Equals(Users.AdministratorId)))
        {
            var user = new ApplicationUser
            {
                Id = Users.AdministratorId,
                UserName = Users.AdministratorEmail,
                Email = Users.AdministratorEmail,
                EmailConfirmed = true,
                NormalizedEmail = Users.AdministratorEmail.ToUpper(),
                NormalizedUserName = Users.AdministratorEmail.ToUpper(),
                SecurityStamp = Guid.NewGuid().ToString()
            };

            var hasher = new PasswordHasher<ApplicationUser>();
            user.PasswordHash = hasher.HashPassword(user, "our_password");

            _context.Users.Add(user);
        }

위의 모든 것이 문제의 원인이 아닌 경우(나의 경우 IUserStore 구현 시 복사 붙여넣기 버그가 문제임), "SignInManager를 추적하거나 디버깅하는 방법에 대한 모든 아이디어"라는 질문에 답합니다.PasswordSignInAsync 메서드에서 실패한 위치를 확인합니다.", 이 메서드를 디버깅하는 한 가지 방법은 SignInManager 메서드의 내용을 복사하는 것입니다.PasswordSignInAsync에서 파생된 클래스(ApplicationSignInManager)로 이동합니다.

MVC5 이하를 사용하는 경우 여기나 여기에서 소스 코드를 찾을 수 있습니다.

제 경험이 누군가를 도울 수 있을지도 모릅니다.제 경우 컴퓨터를 변경한 것이 문제였고, 새 Windows 10에서는 ASP가 아닌 IIS 기능이 설치되었습니다.NET 기능.

enter image description here

언급URL : https://stackoverflow.com/questions/26430094/asp-net-identity-provider-signinmanager-keeps-returning-failure

반응형