我遇到了一个问题:我的网络安全总是在确认时丢失。我究竟做错了什么? 这是我的验证操作(我已调试它,收到的ID是正确的确认令牌:
public ActionResult Validate(String Id)
{
if (String.IsNullOrEmpty(Id))
{
return View();
}
bool b = WebSecurity.ConfirmAccount(Id);
if (b)
{
return View("ConfirmationSuccess");
}
return View("ConfirmationFailure");
}
这是我的注册行动:
public ActionResult Register(RegisterModel model, string ReturnUrl)
{
if (ModelState.IsValid)
{
// Попытка зарегистрировать пользователя
try
{
string confirmationToken = WebSecurity.CreateUserAndAccount(model.rEmail.ToLower(), model.rPassword, null, true);
dynamic email = new Email("~/Views/Emails/RegisterConfirmation.cshtml");
email.To = model.rEmail;
email.ConfirmationToken = confirmationToken;
email.Send();
return RedirectToAction("EmailValidation", new { Email = model.rEmail.ToLower() });
}
catch (MembershipCreateUserException e)
{
string field = string.Empty;
switch (e.StatusCode)
{
case MembershipCreateStatus.DuplicateUserName:
field = "rEmail";
break;
case MembershipCreateStatus.InvalidPassword:
field = "rPassword";
break;
default:
field = "RegisterForm";
break;
}
ModelState.AddModelError(field, ErrorCodeToString(e.StatusCode));
}
}
ViewBag.RegisterModel = model;
ViewBag.ReturnUrl = ReturnUrl;
ViewBag.LoginModel = new LoginModel();
//ModelState.AddModelError("rEmail", "Пользователь с таким e-mail уже зарегистрирован");
// Появление этого сообщения означает наличие ошибки; повторное отображение формы
return View("Login");
}
注册后发送电子邮件,链接是正确的链接,但当它转到WebSecurity.ConfirmAccount(Id)时,它总是抛出错误....
感谢您的时间,对不起我的英语不好。
UPD: 在我的IIS服务器上有一个转换器可以降低所有URL。可能是这样,它比较了区分大小写的键吗?我该如何解决这个问题?
UPD: 好吧,问题实际上是小写网址。 WebSecurity.ConfirmAccount是区分大小写的......我在我的操作中做了一些解决方法,以便我可以获得正确的ConfitmtionToken,但这不是完全正确的方式,而我可能会有两个相同的ConfirmationToken.ToLower(),所以,请某人指出正确的方法。 这是我的解决方法:
public ActionResult Validate(String Id)
{
if (String.IsNullOrEmpty(Id))
{
return View();
}
//bool b = WebSecurity.ConfirmAccount(Id);
using (var ctx = new DBContext())
{
Id = ctx.wpMembership.Where(s => s.ConfirmationToken.Equals(Id, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault().ConfirmationToken;
}
if (WebSecurity.ConfirmAccount(Id))
{
return View("ConfirmationSuccess");
}
return View("ConfirmationFailure");
}
答案 0 :(得分:1)
这是因为您传递的帐户ID不是确认令牌。您需要传递确认令牌。
确认令牌由CreateAccount(String,String,Boolean),CreateUserAndAccount(String,String,Object,Boolean)和GeneratePasswordResetToken(String,Int32)方法生成。令牌通常作为电子邮件中的链接发送给用户,用户单击该链接以验证其身份。