身份2 - 确认电子邮件,然后允许用户设置密码

时间:2016-09-15 15:39:47

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

我正在编写一个应用程序(MVC5,Identity 2.0和Entity Framework 6),其中包含只有管理员才能访问的“用户”部分。添加用户的唯一地方是本节,除非您注册了新的组织(用户的父级)。

我已经掌握了所有功能,但希望更好地添加用户流程。目前,管理员使用硬编码密码创建用户,并向他们发送电子邮件,要求他们确认其帐户。他们点击这个,帐户被确认,然后他们必须登录。显然,硬编码密码不适合生产应用程序!

我真的很喜欢添加用户,生成随机密码,发送确认帐户电子邮件,然后一旦用户点击它,他们的帐户被确认,然后他们被重新定向到他们可以重置自己密码的页面。

所以,代码忍者,这可能吗?如果是这样,任何建议将不胜感激!

2 个答案:

答案 0 :(得分:8)

是的。您可以删除管理员输入的硬编码密码,并替换您的呼叫以创建用户var result = await UserManager.CreateAsync(user);此时不提供密码。确保在创建时向用户发送邮件以确认电子邮件。这是example

在confirmEmail操作视图中,您可以创建密码设置表单并发回以确认电子邮件。以下示例:

HTTP Get ConfirmEmail

    [AllowAnonymous]
    public async Task<ActionResult> ConfirmEmail(string userId, string code)
    {
        if (userId == null || code == null)
        {
            return View("Error");
        }
        var confirmed = await UserManager.IsEmailConfirmedAsync(userId);
        if(confirmed)
        {
            return await RedirectToDashboard(userId);
        }

        var result = await UserManager.ConfirmEmailAsync(userId, code);

        if (result.Succeeded)
        {
            ViewBag.userId = userId;
            ViewBag.code = code;
        }
        return View(result.Succeeded ? "ConfirmEmail" : "Error");
    }

从您设置的密码表单到ConfirmEmail的HTTP POST:

    [HttpPost]
    [ValidateAntiForgeryToken]
    [AllowAnonymous]
    public async Task<ActionResult> ConfirmEmail(SetPasswordViewModel model, string userId, string code)
    {
        if (userId == null || code == null)
        {
            return View("Error");
        }
        if (!ModelState.IsValid)
        {
            return View(model);
        }
        var result = await UserManager.AddPasswordAsync(userId, model.NewPassword);
        if (result.Succeeded)
        {
            var user = await UserManager.FindByIdAsync(userId);
            if (user != null)
            {
                await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
            }
            return await RedirectToDashboard(userId);
        }

        ViewBag.userId = userId;
        ViewBag.code = code;

        AddErrors(result);
        return View(model);
    }

要放入ConfirmEmailView

的示例表单
    @using (Html.BeginForm("ConfirmEmail", "Account", new { userId = ViewBag.userId, code = ViewBag.code }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
                {
                    @Html.AntiForgeryToken()

                    @Html.ValidationSummary("", new { @class = "color_orange" })
                      @Html.PasswordFor(m => m.NewPassword, new { @class = "form-control", placeholder = "New Password" })
                      @Html.PasswordFor(m => m.ConfirmPassword, new { @class = "form-control", placeholder = "Confirm Password" })
                      <input type="submit" value="Set password" class="btn" />


                }

请务必在确认电子邮件视图@model [ProjectName].Models.SetPasswordViewModel

中添加模型

创建SetPasswordViewModel:

    public class SetPasswordViewModel
{
    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "New password")]
    public string NewPassword { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm new password")]
    [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }
}

答案 1 :(得分:0)

我还需要相同的功能。我通过脏代码实现了这一点。

import requests
import sys

try:

    r = requests.get("https://the product web ui address")
    data = r.content
    print r.status_code
    print data
except:
    print "Error Occured ",sys.exc_info()[0]

因此,他们会在管理员创建帐户后收到确认电子邮件,然后在他们点击该链接后,他们将再次收到另一封电子邮件以重置密码。

如果你有更好的方法来实现这一点,我也很高兴知道。 :)

相关问题