Identity IdentityUser PasswordHash는 언제 업데이트됩니까?

claims-based-identity dapper intuit password-hash

문제

MVC app / WebApi 서비스를 ExternalLogin 자격 증명, 특히 Intuit 외부 자격 증명과 함께 만들려고 시도하고 Intuit에 로그인 한 상태에서 로그인 프로세스에서 웹 응용 프로그램의 현재 ID를 설정할 수 있기 때문에 내가 이것을 묻는 이유가 있습니다. 3-legged OAuth 프로세스를 사용합니다. Dapper를 EntityFramework가 아닌 백엔드로 사용하고 있습니다.

웹 API 용 ASP.Net 웹 응용 프로그램의 기본 새 프로젝트를 만들면 AccountController를 만들고 GetInfo라는 계정 관리 호출을 포함합니다. 이 함수는 로컬 로그인 공급자 정보를 설정하기 전에 PasswordHash를 확인합니다 (PasswordHash는 IdentityUser의 속성 임).

        if (user.PasswordHash != null)
        {
            logins.Add(new UserLoginInfoViewModel
            {
                LoginProvider = LocalLoginProvider,
                ProviderKey = user.UserName,
            });
        }

따라서 PasswordHash를 관리하는 논리는 이미 다른 곳에서도 설명되어 있습니다. 그게 어디 있겠 니? EntityFramework를 사용한 일반적인 설정에서 IdentityUser 클래스 나 UserManager 클래스 (UserStore?)의 어딘가에서 처리됩니다. 소스 코드에서 찾을 수 없습니다.

Dapper를 사용하여 구현 한 내용에서 Microsoft.AspNet.Identity.EntityFramework;

  1. PasswordHash의 계산, 설정 및 확인은 어디에서 발생해야합니까?
  2. 속성은 언제 설정해야합니까?

아니면 어떤 까다로운 검은 색 작업 과정에서 개체에 대해 설정하는 것처럼 걱정하지 않습니까 ??

수락 된 답변

암호가 설정되어 있지 않으면 외부 공급자와 로그인 한 후 데이터베이스를 확인하십시오.

어떤 일이 일어나는가?

  1. 사용자가 로그인하려고 함
  2. 사용자가 Google / Facebook을 사용하여 로그인하려면 버튼을 클릭하십시오.
  3. Google / Facebook은 로그인 한 후 다른 정보와 함께 외부 토큰을 보냅니다.
  4. 이 토큰은 MVC 응용 프로그램이 사용자를 인증하는 데 사용할 사용자에 대한 정보를 포함합니다. (사용자 클레임, 쿠키 사용)
  5. 귀하의 MVC 애플 리케이션은 계정이 이미 존재하는지 데이터베이스 내에서 점검 할 것입니다. 6 존재하지 않으면 사용자에게 데이터베이스에 저장 될 이메일 주소를 입력하라는 메시지를 표시합니다 (Google / Facebook 이메일과 동일한 이메일 일 필요는 없습니다).

모든 마술이 일어나는 과정은 Owin.Security 내부에 있습니다. Owin.Security

인증 프로세스는 ExternalLogin, ExternalLoginCallback 메소드 내에 있습니다. 기본 MVC 템플릿과 함께 제공되는

   // POST: /Account/ExternalLogin
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult ExternalLogin(string provider, string returnUrl)
    {
        // Request a redirect to the external login provider
        return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl }));
    }

    // GET: /Account/ExternalLoginCallback
    [AllowAnonymous]
    public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
    {
        var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
        if (loginInfo == null)
        {
            return RedirectToAction("Login");
        }

        // Sign in the user with this external login provider if the user already has a login
        var user = await UserManager.FindAsync(loginInfo.Login);
        if (user != null)
        {
            await SignInAsync(user, isPersistent: false);
            return RedirectToLocal(returnUrl);
        }
        else
        {
            // If the user does not have an account, then prompt the user to create an account
            ViewBag.ReturnUrl = returnUrl;
            ViewBag.LoginProvider = loginInfo.Login.LoginProvider;
            return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = loginInfo.Email });
        }
    }


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow