【问题标题】:How to make Confirmation link activate accounts in MVC4?如何使确认链接激活 MVC4 中的帐户?
【发布时间】:2013-01-15 23:52:17
【问题描述】:

我正在从默认的 Internet 应用程序开始构建一个 MVC 4 应用程序。我的目标是在用户注册网站时向他们发送一封确认电子邮件,我已经成功发送了确认电子邮件,但是当我点击它时,帐户没有得到确认。

注意:我知道注册操作很拥挤,当我让它工作时,我会将其分成不同的文件。

*这就是我所做的:*

注册操作

[HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Register(RegisterModel model)
    {
        if (ModelState.IsValid)
        {
            try //CreateUserAndAccount
            {
                var token = WebSecurity.CreateUserAndAccount(model.UserName, model.Password, null, true);
                if (token != null)
                {
                    var hosturl =
                        System.Web.HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) +
                        "/Account/ConfirmAccount?token=" + token;

                    var confirmationLink = string.Format("<a href=\"{0}\">Clink to confirm your registration</a>",
                                                         hosturl);




                    var message = new MailMessage("komengem@gmail.com", model.UserName)
                    {
                        Subject = "Please confirm your email",
                        Body = confirmationLink
                    };

                    var client = new SmtpClient();
                    client.EnableSsl = true;
                    client.Send(message);
                }

                TempData["message"] = string.Format(
                    "Thank you for registering. An email has been sent to {0}. " +
                    "Please check your email and use the enclosed link to finish registration.", model.UserName);
                return RedirectToAction("Index", "Home");
            }
            catch (MembershipCreateUserException e)
            {
                ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
            }
        }

ConfirmAcount 操作

public ActionResult ConfirmAccount(string ID)
    {
        //return View("ConfirmAccount");
        var confirmationToken = Request["token"];
        if (!String.IsNullOrEmpty(confirmationToken))
        {
            var user = WebSecurity.CurrentUserName;
            WebSecurity.ConfirmAccount(confirmationToken);
            WebSecurity.Login(user, null);
            return View("Welcome");
        }

        TempData["message"] = string.Format(
                    "Your account was not confirmed, please try again or contact the website adminstrator.");
        return RedirectToAction("Index", "Home");            
    }

也试过了

public ActionResult ConfirmAccount(string ID)
    {
        if (string.IsNullOrEmpty(ID) || (!Regex.IsMatch(ID,
                        @"[0-9a-f]{8}\-([0-9a-f]{4}\-){3}[0-9a-f]{12}")))
        {
            TempData["tempMessage"] =
                "The user account is not valid. Please try clicking the link in your email again.";
            return View();
        }
        MembershipUser user = Membership.GetUser(new Guid(ID));

        if (!user.IsApproved)
        {
            user.IsApproved = true;
            Membership.UpdateUser(user);
            FormsAuthentication.SetAuthCookie(user.UserName, false);
            return RedirectToAction("Login");
        }
        WebSecurity.Logout();
        TempData["tempMessage"] = "You have already confirmed your email address... please log in.";
        return RedirectToAction("Login");
    }      

谁能告诉我如何使这项工作,或者建议一种不同的方式来使这项工作?

【问题讨论】:

  • 指定的字符串是什么? model.UserNamesomeone@somewhere.com 的形式吗?
  • 你没有设置邮件的发件人,这可能会有所不同
  • 嗯,很明显这是Webmail.Send() 调用的问题,而不是其他问题。我会专注于让那个发挥作用。
  • @RobertHarvey 那么,我应该假设我所有的代码都在正确的位置吗?这是我最大的担心
  • 也许这是个愚蠢的问题,但是您是否在本地机器上设置了邮件服务器?

标签: c# asp.net-mvc-4 ef-code-first security email-confirmation


【解决方案1】:

我鼓励您使用 Postal,这是一个简单易用的电子邮件创建包。它以 nuget 包的形式提供。

还可以查看 Kevin Junghans 关于该主题的博文! Email confirmation

【讨论】:

  • 是的,我正在查看 Postal 和 Kevin 的博客。谢谢
  • 嗨 Komenge,我有一个疑问 - 现在用户帐户已经确认 - 我想再次将其设为 PENDING 以便下次再次确认.. 请告诉我该怎么做?跨度>
  • +!对于邮政... 非常有用的包裹。谢谢
【解决方案2】:

我已经完成了以下操作,并且正在运行:

在注册中创建令牌为:

string confirmationToken =
                        WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new { Email = model.Email }, true);

然后在确认中使用了以下内容:

public ActionResult RegisterConfirmation(string Id)
        {
            if (WebSecurity.ConfirmAccount(Id))
            {
                return RedirectToAction("ConfirmationSuccess");
            }
            return RedirectToAction("ConfirmationFailure");
        }

【讨论】:

    【解决方案3】:

    来自您编辑的错误消息听起来像是您的本地计算机既没有在端口25 也没有在587 上侦听。我认为您应该在对代码执行任何操作之前检查 SMTP 服务器是否已配置并运行。

    您只需在此本地服务器上创建 2 个帐户并在任何电子邮件客户端中设置它们,然后检查您是否能够在它们之间发送电子邮件。第二个选项是使用 telnet 检查连接,但我没有尝试过 - http://www.petri.co.il/test_smtp_service.htm

    如果在您的应用程序之外使用邮件服务器成功并且您仍然有错误,请确保您的 WebMail.UserNameWebMail.Password 是正确的。如果是,请尝试将WebMail.From 设置为您在WebMail 配置中使用的本地测试电子邮件地址之一,例如test@localhosttest@127.0.0.1(有时我不得不使用IP 来通过电子邮件验证)。

    【讨论】:

    • 我只是不明白为什么端口25 不能在localhost 上工作。这是我知道的唯一一个适用于本地机器上的Smpt E-mail 的端口。我只是认为我的代码出了点问题。不管怎样,我刚收到我的Pro ASP.NET MVC4 book 我会检查那里是否有类似的东西。
    • @KomengeMwandila 但是您是否像我建议的那样检查过 SMTP 服务器是否在自己运行?首先检查它,如果它正在工作,请检查您的代码。
    • 我将端口更改为我的应用程序端口,现在我得到The operation has timed out.,所有错误都发生在:WebMail.Send
    • @KomengeMwandila 您有一个不同的错误,因为在您的应用程序的端口上运行了一项服务 - 它是应用程序的服务器并且操作已超时,因为该服务不是为处理 SMTP 请求而创建的。使用我发布的其中一种方式检查您的 SMTP 服务器是否正在运行。 SMTP 应该在端口25 上。错误消息No connection could be made because the target machine actively refused it 127.0.0.1:PORT 表示没有服务在此端口上侦听或防火墙导致问题。但由于它是您的本地开发机器,所以 fw 应该不是问题。
    猜你喜欢
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 2018-02-08
    • 2012-02-28
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多