2017-12-15 20 views
0

ASP.NET MVC5에서 ASP.NET ID를 사용 중이고 PasswordSignInAsync에 추가로 사용자 정의 로그인 규칙을 구현해야합니다. PasswordSignInAsyncApplicationSignInManager와 추가 속성에 대한 과부하 상태 저장하기 :ASP.NET ID의 사용자 정의 로그인 규칙은 유효하지만 브라우저는 여전히 집으로 리디렉션됩니다.

public class ApplicationSignInManager : SignInManager<ApplicationUser, string> 
{ 
    public EnumCompanyStatus CompanyStatus { get; private set; } 

    public ApplicationSignInManager(ApplicationUserManager userManager, IAuthenticationManager authenticationManager) : base(userManager, authenticationManager) 
    { 
     CompanyStatus = EnumCompanyStatus.Active; 
    } 

    // Standard scaffolding omitted 

    public async Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout, Func<string, EnumCompanyStatus> getCompanyStatus) 
    { 
     SignInStatus signInStatus = await base.PasswordSignInAsync(userName, password, isPersistent, shouldLockout); 

     if (signInStatus == SignInStatus.Success) 
     { 
      CompanyStatus = getCompanyStatus(userName); 

      if (CompanyStatus != EnumCompanyStatus.Active) 
       signInStatus = SignInStatus.Failure; 
     } 

     return signInStatus; 
    } 
} 

을 그리고 이것은 AccountController 내 로그인 방법 :

내 문제가 switch/case 문에서 default 경우에있다
[HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(model); 
     } 

     var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, false, GetCompanyStatus); 

     switch (result) 
     { 
      case SignInStatus.Success: 
       return RedirectToLocal(returnUrl); 
      case SignInStatus.LockedOut: 
       return View("Lockout"); 
      case SignInStatus.RequiresVerification: 
       return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); 
      case SignInStatus.Failure: 
      default: 
       if (SignInManager.CompanyStatus == EnumCompanyStatus.Disabled) 
        ModelState.AddModelError("", "User disabled."); 
       else if (SignInManager.CompanyStatus == EnumCompanyStatus.Frozen) 
        ModelState.AddModelError("", "Please contact our support."); 
       else 
        ModelState.AddModelError("", "Invalid login attempt."); 
       return View(model); 
     } 
    } 

. SignInManager.CompanyStatusDisabled 또는 Frozen이면이 코드는 올바르게 표시되지만 번 사용자는 대부분 내게 오류 메시지를 인쇄하는 대신 홈 페이지로 리디렉션됩니다. 그것은 몇 번 일했지만 내 breakpoint가 진행중입니다. 실행이 마지막 조건에 도달하면 기존의 로그인 시도가 실패합니다. 완벽하게 작동합니다 (로그인 페이지에 오류 메시지가 표시되고 리디렉션이 발생하지 않음). .NET은 signInStatus을 사용하여 너무 복잡해 보이지 않습니다. 내가 여기서 무엇을 놓치고 있니? 나는 길을 잃고있는 또 다른 부동산이 있다는 것을 상상할 수 있지만, 수년 동안 웹 개발에 착수했으며 지금 당장 도움을받을 수 있습니다.

답변

0

좀 더 뒤죽박죽이 된 후에 PasswordSignInAsync가 내가 나중에 한 일에 상관없이 내 요청의 유효성을 검사 한 내부 상태를 실제로 변경하고 있다고 생각했습니다. 그래서 사용자 지정 유효성 검사 및 기본 메서드 호출 순서를 바꿨습니다.

public async Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout, Func<string, EnumCompanyStatus> getCompanyStatus) 
    { 
     CompanyStatus = getCompanyStatus(userName); 

     if (CompanyStatus != EnumCompanyStatus.Active) 
      return SignInStatus.Failure; 

     return await base.PasswordSignInAsync(userName, password, isPersistent, shouldLockout); 
    }