c# - 密码登录异步 MVC C#

标签 c# asp.net-mvc entity-framework model-view-controller asp.net-identity

美好的一天,我正在编写一个 MVC 应用程序,它只能允许用户使用 ID、电子邮件和密码这三个参数登录。我的问题是PasswordSignInAsync有两个主要参数电子邮件和密码。我如何覆盖它以允许 ID 作为登录的另一个参数。

这是正常的代码:

  [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }

        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, change to shouldLockout: true
        var result =  await SignInManager.PasswordSignInAsync(model.Email,model.Password, model.RememberMe, shouldLockout: false);
        switch (result)
        {
            case SignInStatus.Success:
                return RedirectToAction("DealerDashboard", "Dealers");
            case SignInStatus.LockedOut:
                return View("Lockout");
            case SignInStatus.RequiresVerification:
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
            case SignInStatus.Failure:
            default:
                ModelState.AddModelError("", "Invalid login attempt.");
                return View(model);
        }
    }

//所以在我的解决方案中我想这样做:

  [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }

        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, change to shouldLockout: true
        var result =  await SignInManager.PasswordSignInAsync(model.id,model.Email, model.Password, model.RememberMe, shouldLockout: false);
        switch (result)
        {
            case SignInStatus.Success:
                return RedirectToAction("DealerDashboard", "Dealers");
            case SignInStatus.LockedOut:
                return View("Lockout");
            case SignInStatus.RequiresVerification:
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
            case SignInStatus.Failure:
            default:
                ModelState.AddModelError("", "Invalid login attempt.");
                return View(model);
        }
    }

最佳答案

确实,正如 Igor 所说,您只需要重写 SignInManager 即可。像这样的事情:

public class ApplicationSignInManager : SignInManager<ApplicationUser, Guid>
{

    // adjust as needed
    public ApplicationSignInManager(ApplicationUserManager userManager, IAuthenticationManager authenticationManager)
        : base(userManager, authenticationManager)
    {
    }

    public Task<SignInStatus> PasswordSignInAsync(string userId, string userName, string password, bool isPersistent, bool shouldLockout)
    {
        var user = await base.UserManager.FindByIdAsync(userId);

        // do validation for user, etc.

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

关于c# - 密码登录异步 MVC C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43345230/

相关文章:

c# - WeakEvent 的事件监听器可以随时被垃圾回收删除吗?

c# - 在c#中抛出异常

c# - 当 "benchmarking"documentdb 时,结果截然不同

.net - 如何为 Entity Framework 创建三层解决方案

C# 泛型和转换

javascript - 从 JSON 响应创建一个可观察的敲除数组

c# - Asp.Net Mvc 从数据库表中删除列

asp.net - 在 ASP.NET MVC2 中,有没有一种方法可以在传递参数时返回 redirectToAction?

c# - EF - "Update-Database"导致序列包含多个元素

c# - 在移动服务数据库上启用代码优先迁移时出错