防止没有确认电子邮件的用户使用Identity 2登录ASP.Net MVC

ali*_*izx 14 asp.net-mvc asp.net-identity

在microsoft Identity 2中有能力用户可以确认我在这个项目中从这里下载了Identity 2示例项目的电子邮件地址没有任何区别用户确认了他们的电子邮件和谁没有我想要的人如何不确认他们的电子邮件无法登录这是我试过的:

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, shouldLockout: true);
        switch (result)
        {
            case SignInStatus.Success:
                {


                    var user = await UserManager.FindByNameAsync(model.Email);
                    if (user != null)
                    {
                        if (!await UserManager.IsEmailConfirmedAsync(user.Id))
                        {
                            //first I tried this.
                            //return LogOff();
                            HttpContext.Server.TransferRequest("~/Account/LogOff");
                            return RedirectToAction("Login");
                        }
                    }

                    return RedirectToLocal(returnUrl);
                }
            case SignInStatus.LockedOut:
                return View("Lockout");
            case SignInStatus.RequiresVerification:
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl });
            case SignInStatus.Failure:
            default:
                ModelState.AddModelError("", "Invalid login attempt.");
                return View(model);
Run Code Online (Sandbox Code Playgroud)

我试图通过调用LogOff()操作方法强制用户注销,但它没有工作,用户保持身份验证.然后我尝试使用Server.TransferRequest()但我不知道为什么它完成了这项工作,但它将用户重定向到使用returnUrl的登录页面="帐户/注销"所以在他们确认他们的电子邮件并尝试登录他们得到注销后我真的很困惑!这是我的LogOff()动作方法:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    {
        AuthenticationManager.SignOut();
        return RedirectToAction("About", "Home");
    }
Run Code Online (Sandbox Code Playgroud)

我用谷歌搜索了几天没有运气!!!!

INF*_*_18 34

也许它有点晚了,但我希望它可以帮助别人.

加上这个

var userid = UserManager.FindByEmail(model.Email).Id;
        if (!UserManager.IsEmailConfirmed(userid))
        {
            return View("EmailNotConfirmed");
        }
Run Code Online (Sandbox Code Playgroud)

之前

var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
Run Code Online (Sandbox Code Playgroud)

第一个代码块只是检查模型中的电子邮件是否存在于数据库中并获取它的id以检查它是否未被确认,如果是,则返回给用户的视图,如果确认,则只允许用户签名在.

并删除对结果开关的更改,如下所示

switch (result)
        {
            case SignInStatus.Success:
                    return RedirectToLocal(returnUrl);
            case SignInStatus.LockedOut:
                return View("Lockout");
            case SignInStatus.RequiresVerification:
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl });
            case SignInStatus.Failure:
            default:
                ModelState.AddModelError("", "Invalid login attempt.");
                return View(model);
        }
Run Code Online (Sandbox Code Playgroud)

  • 这解决了问题,但会显示某个用户是否已在您的应用中注册.没什么大不了的,但有人可以尝试使用其他用户的电子邮件和错误的密码登录并获取NotConfirmed视图,因此知道此电子邮件已注册且未确认. (9认同)

Pat*_*man 6

为什么不完成这个并重定向到正确的操作/视图,而不是移动到另一个页面:

if (!await UserManager.IsEmailConfirmedAsync(user.Id))
{
    return RedirectToAction("ConfirmEmailAddress", new { ReturnUrl = returnUrl });
}
Run Code Online (Sandbox Code Playgroud)

您确实需要一个带有名称的动作(可能还有一个视图)ConfirmEmailAddress.