在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.CompanyStatus
是Disabled
或Frozen
时,将正确达到此相应的代码,但是,大多数时间 >用户仍然会重定向到主页,而不是只需打印我的错误消息。它已经工作了几次,但是我的断点妨碍了。如果执行达到最后一个条件,传统的登录失败尝试,则可以完美地工作(错误消息显示在登录页面中,并且没有进行重定向),但是.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);
}