ASP.NET身份中的自定义登录规则已验证,但浏览器仍将重定向到家



在ASP.NET MVC5中,我正在使用ASP.NET身份,我必须通过将PasswordSignInAsync Overload添加到ApplicationSignInManager和其他属性来存储,除了PasswordSignInAsync之外,我还必须实现一些自定义登录规则。状态:

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中的登录方法:

    [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);
        }
    }

我的问题在于switch/case语句中的default情况。每当SignInManager.CompanyStatusDisabledFrozen时,将正确达到此相应的代码,但是,大多数时间 >用户仍然会重定向到主页,而不是只需打印我的错误消息。它已经工作了几次,但是我的断点妨碍了。如果执行达到最后一个条件,传统的登录失败尝试,则可以完美地工作(错误消息显示在登录页面中,并且没有进行重定向),但是.NET似乎对我对signInStatus的混乱不满意。我在这里想念什么?我只能想象还有另一个属性妨碍了我的路,但是我几年来解决了网络开发,我现在可以真正使用一些帮助。

在更多地摸索之后,我认为是的,密码signInAsync确实正在更改内部状态,无论我以后做什么,都验证了我的请求。因此,我只是交换了自定义验证和基本方法的顺序:

    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);
    }

相关内容

  • 没有找到相关文章