ASP.NET MVC5에서 ASP.NET ID를 사용 중이고 PasswordSignInAsync
에 추가로 사용자 정의 로그인 규칙을 구현해야합니다. PasswordSignInAsync
ApplicationSignInManager
와 추가 속성에 대한 과부하 상태 저장하기 :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.CompanyStatus
이 Disabled
또는 Frozen
이면이 코드는 올바르게 표시되지만 번 사용자는 대부분 내게 오류 메시지를 인쇄하는 대신 홈 페이지로 리디렉션됩니다. 그것은 몇 번 일했지만 내 breakpoint가 진행중입니다. 실행이 마지막 조건에 도달하면 기존의 로그인 시도가 실패합니다. 완벽하게 작동합니다 (로그인 페이지에 오류 메시지가 표시되고 리디렉션이 발생하지 않음). .NET은 signInStatus
을 사용하여 너무 복잡해 보이지 않습니다. 내가 여기서 무엇을 놓치고 있니? 나는 길을 잃고있는 또 다른 부동산이 있다는 것을 상상할 수 있지만, 수년 동안 웹 개발에 착수했으며 지금 당장 도움을받을 수 있습니다.