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

标签 asp.net-mvc asp.net-identity

在 microsoft Identity 2 中,用户可以确认我从 here 下载 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);

我试图通过调用 LogOff() 操作方法来强制用户注销,但它不起作用并且用户保持身份验证。然后我尝试使用 Server.TransferRequest()但我不知道为什么它会完成这项工作,但它会将用户重定向到带有 returnUrl="Account/Logoff"的登录页面
因此,在他们确认电子邮件并尝试登录后,他们会注销,我真的很困惑!
这是我的 LogOff() 操作方法:
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    {
        AuthenticationManager.SignOut();
        return RedirectToAction("About", "Home");
    }

我已经用谷歌搜索了好几天没有任何运气!!!!

最佳答案

也许它有点晚了,但我希望它可以帮助其他人。

添加这个

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


var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);

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

并像这样删除对结果开关的更改
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);
        }

关于asp.net-mvc - 防止没有确认电子邮件的用户使用 Identity 2 登录 ASP.Net MVC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25229893/

相关文章:

asp.net-mvc - 测量 ASP .NET Web 应用程序性能的工具

c# - 如何使用 mvc 6、asp.net 5 注册全局过滤器

asp.net-mvc - MVC4 HTML.ValidationMessageFor 不显示验证消息

asp.net-mvc - ASP.NET MVC - 母版页 View 和呈现部分 - 混淆

c# - 如何删除默认的 ASP.NET Core Identity 端点?

ASP.NET MVC : Action Filter to set up controller variables?

c# - 如何使用 ASP.NET Identity Framework 设置密码过期

c# - 如何将 ASP.NET Core Identity 用户作为 EF 迁移的一部分

c# - Asp.net Identity 2.0 使用自定义唯一属性扩展 UserValidator

c# - UserManager<XYZ >' does not contain a definition for ' CreateIdentityAsync' 并且没有可访问的扩展方法