我正在编写一个应用程序(MVC5,Identity 2.0和Entity Framework 6),其中包含只有管理员才能访问的“用户”部分。添加用户的唯一地方是本节,除非您注册了新的组织(用户的父级)。
我已经掌握了所有功能,但希望更好地添加用户流程。目前,管理员使用硬编码密码创建用户,并向他们发送电子邮件,要求他们确认其帐户。他们点击这个,帐户被确认,然后他们必须登录。显然,硬编码密码不适合生产应用程序!
我真的很喜欢添加用户,生成随机密码,发送确认帐户电子邮件,然后一旦用户点击它,他们的帐户被确认,然后他们被重新定向到他们可以重置自己密码的页面。
所以,代码忍者,这可能吗?如果是这样,任何建议将不胜感激!
答案 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]
因此,他们会在管理员创建帐户后收到确认电子邮件,然后在他们点击该链接后,他们将再次收到另一封电子邮件以重置密码。
如果你有更好的方法来实现这一点,我也很高兴知道。 :)